() translation by (you can also view the original English article)
مدیریت سِشن (Session) یکی از مفاهیم کلیدی پیاچپی است که این امکان را میدهد اطلاعات کاربر در سرتاسر صفحههای وبسایت پایدار باشد. در این پُست، شما پایههای مدیریت سشن در پیاچپی را فرا میگیرید.
اول با توضیح اینکه سشنها چگونه کار میکنند و چه ارتباطی به کوکی ها(Cookies) دارند شروع میکنیم. سپس نگاهی داریم به تعدادی قطعه کُد که نحوهی عملکرد سشنها را نشان میدهند. شما یاد خواهید گرفت که چگونه سشن بسازید یا از بین ببرید و چگونه متغییرهای سشن را تغییر دهید.
یک سشن در پیاچپی چیست؟
سشن درواقع مکانیزیمی است برای پایدار نگه داشتن اطلاعات را در سرتاسر صفحات مختلف وبسایت. بدین شکل میتوان کاربران را که در صفحات مختلف اپلیکیشن یا وبسایت در حال گردش هستند تعیین هویت کرد. برایتان سوال وجود دارد که چرا یک وبسایت نیاز به سشن دارد؟ برای اینکه ببینیم چرا سشنها ضروری هستند، باید به عقبتر برگردیم و ببینیم چگونه پروتکل HTTP طراحی شده است.
پرتکل HTTP یک پروتکل بدون وضعیت است، به این معنی که راهی وجود ندارد که یک سرور بتواند بین درخواستهای متعددی که دریافت میکند کاربر خاصی را به یاد داشته باشد. به عنوان مثال وقتی که شما درخواست دسترسی به صفحهی خاصی را میدهید، سرور فقط مسئول این است که محتوای صفحهی درخواست شده را برای شما فراهم کند. پس وقتی که شما به صفحههای دیگر همان وبسایت رجوع میکنید، وبسرور هر درخواست را به صورت یک درخواست جداگانه تفسیر میکند، انگار که درخواستها ربطی به یکدیگر ندارند. هیچراهی وجود ندارد که یک سرور بفهمد که کدام درخواستها از سمت یک کاربر هستند.
شکل زیر پروتکل HTTP را به صورت خلاصه نشان میدهد.



در این مدل اگر میخواستید اطلاعات خاص یک کاربر را نشان دهید، شما میبایستید به ازای هر درخواست، کاربر را احضار هویت میکردید. تصور کنید که مثلاً شما مجبور بودید نامکاربری و رمز عبورتان را برای هر صفحهای که قرار هست اطلاعات پروفایل شما را نشان داهد وارد کنید. قطعاً این کاری عبث، طاقت فرسا و انجام نشدنی خواهد بود، اینجاست که نیاز به سشنها احساس میشود.
سشن به شما این امکان را میدهد که اطلاعات را در صفحههای مختلف یک سایت یا اپلیکیشن به اشتراک بذارید – بدین ترتیب کمک میکند که وضعیت حفظ شود. سشن اجازه میدهد که سرور تمام درخواستهایی را که از سمت یک کاربر نشأت میگیرند تشخیص دهد، بنابراین امکان نمایش اطلاعات مخصوص آن کاربر مهیا میشود.
روند لاگین کردن با استفاده از سشنها و کوکیها
بیایید با هم نگاهی داشته باشیم به روند عمومی لاگین یک وبسایت تا متوجه شویم پشت صحنه چه اتفاقاتی میافتد.
- کاربر صفحه لاگین یک وبسایت را باز میکند.
- بعد از سابمیت کردن فرم ورود، از آن طرف، سرور با اعتبارسنجی اطلاعات ورودی کاربر، اقدام به احراز هویت کاربر میکند.
- اگر اطلاعات ورودی کاربر معتبر باشد، سرور یک سشن جدید می سازد. سرور یک عدد تصادفی منحصر به فرد که با آن شناسه سشن گفته میشود میسازد. همچنین فایل جدیدی بر روی سرور ساخته میشود که اطلاعات مربوط به سشن آن کاربر در آن ذخیره میشود.
- سپس، یک شناسه سشن به همراه هر منبعی که درخواست شده است به سمت کاربر ارسال میشود. در پشت صحنه، این شناسه سشن به عنوان یک کوکی
PHPSESSID
در هدر پاسخ ارسال میشود. - زمانی که یک مرور پاسخ را از سمت سرور دریافت میکند، به هدر کوکی
PHPSESSID
بر میخورد. اگر به کوکیها از طرف مرورگر مجوز داده شده باشد، مرورگر کوکیPHPSESSID
را ذخیره میکند، که باعث ذخیر شدن شناسه سشنی که سرور فرستاده است میشود.
- برای درخواستهای بعدی، کوکی
PHPSESSID
به سرور پس فرستاده میشود. وقتی سرور با کوکیPHPSESSID
مواجه میشود، سعی میکند که یک سشن را با استفاده از آن شناسه سشن آغاز کند. این کار را با بارگزاری فایل سشنای که پیشتر ساختهبود انجام میدهد. سپس متغییر فوق سراسری$_SESSION
را با دادههای که در فایل سشن وجود دارد مقدار دهی اولیه میکند.
بدین صورت، اطلاعات کاربر در سرتاسر درخواستهای متعددی که ارسال میشود حفظ میشود و کاربر در طِی یک سشن به صورت لاگین شده باقی میماند.
شکل زیر نشان میدهد که پروتکل HTTP چگونه با سشنها کار میکند.



حالا که مقدمهای کوتاه در مورد چگونگی عمکلرد سشنها دیدید، تعدادی مثال عملی با هم خواهیم ساخت تا نشان دهیم چگونه متغییرهای سشن را میتوان ساخت یا تغییر داد.
چگونه یک سشن را شروع کنیم
در این بخش، در مورد چگونگی ایجاد یک سشن در پیاچپی صحبت خواهیم کرد.
هر زمان که میخواهید با یک متغییر سشن کار کنید، ابتدا باید مطمئن شوید که یک سشن شروع به کار کرده است. در پیاچپی راههای مختلفی وجود دارد که یک شسن را آغاز کنید.
استفاده از تابع session_start
این متدی است که زیاد خواهید دید، که درواقع یک سشن با تابع session_start
شروع به کار خواهد کرد.
1 |
<?php
|
2 |
// start a session
|
3 |
session_start(); |
4 |
|
5 |
// manipulate session variables
|
6 |
?>
|
نکته مهم این است که تابع session_start
باید در اول اسکریپت فراخوانی شود، قبل از اینکه هر نوع خروجیای به مرورگر ارسال شود. در غیر این صورت، با خطای معروف Headers are already sent
مواجه خواهید شد.
شروع یک سشن به صورت خودکار
اگر نیاز دارید که اپلیکیشنتان از سشنها استفاده کنید، میتوانید بدون استفاده از session_start
یک سشن را به صورت خودکار آغاز کنید.
در php.ini گزینهی پیکربندی وجود دارد که به شما این امکان را میدهد به ازای هر درخواست به صورت خودکار یک سشن را آغاز کنید. sesson.auto_start
مقدار این گزینه به صورت پیشرفض ۰
تنظیم شده است و شما میتوانید با تغییر دادن آن به ۱
تابع شروع خودکار را فعال کنید.
1 |
session.auto_start = 1 |
از طرفی دیگر، اگر به فایل php.ini دسترسی ندارید، اما از وب سرور آپاچی استفاده میکنید، این متغییر را با استفاده از فایل .htaccess میتوانید مقداردهی کنید.
1 |
php_value session.auto_start 1 |
اگر خط بالا را به فایل .htaccess اضافه کنید، به صورت خودکار یک سشن در اپکلیکیشن پیاچپی شما شروع به کار خواهد کرد.
چگونه شناسه سشن را بدست آوریم
همانطور که پیشتر گفتیم، سرور برای هر سشن یک شناسه منحصر به فرد میسازد. اگر میخواهید مقدار آن شناسه را دریافت کنید، میتوانید از تابع session_id
که در قطعه کد زیر نمایش داده شده است استفاده کنید.
1 |
<?php
|
2 |
session_start(); |
3 |
echo session_id(); |
4 |
?>
|
این دستور به شما شناسهی سشن کنونی را خواهد داد. نکته جالب تابع session_id
این است که میتواند یک آرگُمان دریافت کند و آن شناسه سشن است. اگر میخواهید شناسهی سشنی که سرور تولید کرده است را به شناسه دلخواه خودتان تغییر دهید، میتوانید شناسهی مدنظراتان را به عنوان آرگُمان به تابع session_id
بدهید.
1 |
<?php
|
2 |
session_id(YOUR_SESSION_ID); |
3 |
session_start(); |
4 |
?>
|
زمانی که میخواید سشنی را با شناسه دلخواه شروع کنید، مهم است که تابع session_id
قبل از session_start
فراخوانی شود.
چگونه متغییرهای سشن بسازیم
در این بخش، یاد میگیریم که چگونه در پیاچپی متغییرهای سشن را مقدار دهی کنیم.
همانطور که پیشتر گفتیم، زمانی که یک سشن شروع میشود، آرایه عمومی $_SESSION
به اطلاعات اولیه مربوط به سشن مقدار دهی اولیه میشود. به صورت پیشفرض، با یک آرایه خالی مقدار دهی میشود و شما میتوانید با جفت key-value اطلاعات بیشتری را در سشن ذخیره کنید.
جهت اینکه ببینیم چگونه متغییرهای سشن مقداردهی اولیه میشوند مثال زیر را با هم بررسی میکنیم.
1 |
<?php
|
2 |
// start a session
|
3 |
session_start(); |
4 |
|
5 |
// initialize session variables
|
6 |
$_SESSION['logged_in_user_id'] = '1'; |
7 |
$_SESSION['logged_in_user_name'] = 'Tutsplus'; |
8 |
|
9 |
// access session variables
|
10 |
echo $_SESSION['logged_in_user_id']; |
11 |
echo $_SESSION['logged_in_user_name']; |
12 |
?>
|
همانطور که میبینید، با استفاده از تابع session_start
در ابتدای اسکریپت سشن را آغار میکنیم. پس از آن، تعدادی متغییر سشن را مقداری دهی کردهایم. در نهایت، با استفاده از متغیر عمومی $_SESSION
به آن متغییرهای دسترسی پیدا کردیم.
زمانی که از متغییر فوق سراسری $_SESSION
جهت ذخیره داده استفاده میکنید، در نهایت این متغییر بر روی فایل سشن مربوطه روی سرور که زمان شروع سشن ساخته شده است ذخیره میشود. بدین شکل، داده سشن در درخواستهای مختلف قابل دسترس است.
همانطور که بحث شد، اطلاعات سشن در بین درخواستهای مختلف به اشتراک گذاشته شده است، بنابراین متغییرهای سشنی که در یک صفحه مقداردهی شدهاند در صفحههات دیگر نیز قابل دسترس هستند تا زمانی که سشن منقضی شود. به طور کلی زمانی که مرورگر بسته میشود، سشن نیز منقضی میشود.
چگونه متغییرهای سشن را تغییر دهیم و حذف کنیم
متغییرهای سشن را که پیشتر در برنامه ایجاد کردیم میتوانید همانند متغییرهای عمومی پیاچپی تغییر دهید یا حذف کنید.
در مثال زیر میبینیم که چگونه متغییرهای سشن تغییر داده شدهاند.
1 |
<?php
|
2 |
session_start(); |
3 |
|
4 |
if (!isset($_SESSION['count'])) |
5 |
{
|
6 |
$_SESSION['count'] = 1; |
7 |
}
|
8 |
else
|
9 |
{
|
10 |
++$_SESSION['count']; |
11 |
}
|
12 |
|
13 |
echo $_SESSION['count']; |
14 |
?>
|
ر اسکریپت بالا، اول بررسی کردیم که آیا متغییر $_SESSION[‘count’]
تنظیم شده است یا خیر. اگر تنظیم نشده است، مقدار آن را به ۱
تنظیم میکنیم، در غیر این صورت یکی به مقدار قبلی آن اضافه میکنیم. بنابراین، اگر شما این صفحه را چندین بار ریفرش کنید، خواهید دید که هر دفعه، شمارنده یک عدد بیشتر میشود.
از طرفی دیگر، اگر قصد داشته باشید که یک متغییر سشن را حذف کنید، از تابع unset
میتوانید استفاده کنید، همانطور که در قطعه کد زیر نشان داده شده است.
1 |
<?php
|
2 |
// start a session
|
3 |
session_start(); |
4 |
|
5 |
// initialize a session variable
|
6 |
$_SESSION['logged_in_user_id'] = '1'; |
7 |
|
8 |
// unset a session variable
|
9 |
unset($_SESSION['logged_in_user_id']); |
10 |
?>
|
بنابراین، دیگر به $_SESSION[‘logged_in_user_id’]
دسترسی نخواهید داشت به دلیل اینکه توسط تابع unset
حذف شده است. پس به این شکل میتوانید اطلاعات سشن را تغییر دهید.
چگونه یک سشن را از بین ببریم
در این بخش، میبینم که چگونه میتوانید یک سشن را از بین ببرید. در بخش قبلی در مورد تابع unset
صحبت کردیم، که برای حذف یک متغییر سشن مشخص قابل استفاده است. از طرفی دیگر، اگر بخواهید تمام اطلاعات مربوط به سشن را یکجا حذف کنید، از تابع session_destroy
میتوانید استفاده کنید.
با برررسی مثال زیر، میبینیم که این تابع چگونه عمل میکند.
1 |
<?php
|
2 |
// start a session
|
3 |
session_start(); |
4 |
|
5 |
// assume that we’ve initialized a couple of session variables in the other script already
|
6 |
|
7 |
// destroy everything in this session
|
8 |
session_destroy(); |
9 |
?>
|
تابع session_destroy
هرچیزی را که در سشن کنونی ذخیره شده است را حذف میکند. بنابراین، در درخواستهای پس از آن متغییر $_SESSION
را خالی خواهید دید به دلیل اینکه دادههایی که بر روی دیسک ذخیره شده بودند با تابع session_destroy
حذف شدند.
به طوری کلی زمانی که کاربر از سیستم خارج میشود از دستور session_destroy
استفاده کنید.
نتیجهگیری
در این مقاله، ما اصول پایهای مدیریت سشن را در پیاچپی بررسی کردیم. سشن مفهومی کلیدی است که به شما این امکان را میدهد که دادهها را در صفحههای مختلف پایدار نگه دارید.
در نیمهی اول مقاله، ما در مورد مفاهیم اولیه سشن صحبت کردیم و سپس تعدادی مثال پیاچپی ایجاد کردیم و نشان دادیم چگونه میتوانید سشنها را درست کنید، از بین ببرید یا اینکه متغییرهای سشن را تغییر دهید.