شیوه استفاده از نشست ها (Session) در PHP – به زبان ساده


مدیریت نِشَست (session) مفهومی کلیدی در PHP است که امکان حفظ اطلاعات کاربر در میان صفحههای مختلف یک وبسایت یا اپلیکیشن را فراهم میسازد. در این نوشته با مبانی مدیریت نشست در PHP آشنا میشویم. در ابتدا در مورد طرز کار نشستها و ارتباطشان با کوکیها توضیح میدهیم. سپس چند قطعه کد را بررسی میکنیم که طرز کار نشستها را نشان میدهند. شیوه ایجاد و تخریب نشستها و چگونگی تغییر متغیرهای نشست در ادامه بررسی شده است.
منظور از نشست در PHP چیست؟
نشست یا session مکانیسمی است که از طریق آن اطلاعات کاربران در میان صفحههای مختلف یک وبسایت یا اپلیکیشن حفظ میشود تا بتوان آنها را شناسایی کرد. اگر برایتان سؤال شده است که یک وبسایت چه نیازی به نشست دارد، باید کمی به عقبتر بازگردیم و طرز کار پروتکل HTTP را بررسی کنیم.
پروتکل HTTP یک پروتکل بیوضعیت (stateless) است، یعنی یک سرور روشی برای بازشناسی یک کاربر که چند درخواست مختلف ایجاد کرده است ندارد. برای مثال زمانی که به یک صفحه وب مراجعه میکنید، سرور تنها مسئول ارائه محتوای صفحه درخواستی شما است. بنابراین وقتی به صفحههای دیگر همان وبسایت میروید، وبسرور هر یک از درخواستهای شما را به طور جداگانه بررسی میکند، به طوری که گویی به همدیگر هیچ ارتباطی ندارند. هیچ راهی برای این که سرور بداند هر یک از این درخواستها از کاربر یکسانی ارسال شده است، وجود ندارد. در نمودار زیر پروتکل HTTP به طور خلاصه عرضه شده است:
در این مدل اگر بخواهید اطلاعات خاص مرتبط با کاربر را نشان دهد باید هر درخواست کاربر را احراز هویت کنید. تصور کنید دریک وبسایت به هر صفحهای که میخواهید بروید، مجبور باشید نام کاربری و رمز عبور خود را وارد نمایید! مسلماً متوجه هستید که این وظیفه دشواری است و از این رو مفهوم نشست (session) متولد شده است.
متغیر نشست امکان اشتراک اطلاعات میان صفحههای مختلف یک وبسایت یا اپلیکیشن را فراهم میسازد و از این رو به حفظ وضعیت کمک میکند. بدین ترتیب سرور میداند که همه درخواستها از کاربر یکسانی صادر شدهاند و بنابراین اجازه نمایش اطلاعات خاص این کاربر و همچنین اعمال ترجیحهای مخصوص وی را مییابد.
گردش کار Login با استفاده از نشست و کوکی
در این بخش گردش کار معمول یک فرایند Login در وبسایت را بررسی میکنیم تا دریابیم در پشت صحنه چه میگذرد:
- کاربر صفحه Login یک وبسایت را باز میکند.
- پس از ارائه فرم Login، سرور در سوی دیگر درخواست کاربر را از طریق اعتبارسنجی اطلاعات وارد شده احراز هویت میکند.
- اگر اطلاعات وارد شده از سوی کاربر معتبر باشند، سرور یک نشست جدید ایجاد میکند. در این مرحله سرور، عدد تصادفی یکتایی ایجاد میکند که شناسه نشست (session id) نام دارد. همچنین فایل جدیدی روی سرور ایجاد میشود که برای ذخیرهسازی اطلاعات مرتبط با نشست مورد استفاده قرار میگیرد.
- سپس یک شناسه نشست همراه با هر اطلاعاتی که درخواست کرده است، به کاربر بازگردانده میشود. در پشت صحنه این شناسه نشست در کوکی PHPSESSID در هدر پاسخ (response) ارائه میشود.
- زمانی که مرورگر پاسخ را از سرور دریافت میکند به هدر کوکی PHPSESSID مراجعه میکند. اگر کوکیها از سوی مرورگر فعال شده باشند، مرورگر این کوکی PHPSESSID را روی رایانه کاربر ثبت میکند و بدین ترتیب شناسه نشست ارسالی از سوی سرور نیز روی رایانه کاربر ذخیره میشود.
- در هنگام ارسال درخواستهای بعدی این کوکی PHPSESSID نیز به سرور ارسال میشود. زمانی که سرور با PHPSESSID مواجه میشود، تلاش میکند تا یک نشست با شناسه مربوطه ایجاد کند. این کار از طریق بارگذاری فایل نشست که قبلاً در طی مقداردهی اولیه ایجاد شده است، صورت میپذیرد. سپس متغیر آرایه super-global با نام SESSION_$ با محتوای دادهای که در فایل نشست وجود دارد مقداردهی اولیه میشود.
طرز کار نشست در پروتکل HTTP
بدین ترتیب دادههای کاربر در میان چندین درخواست مختلف حفظ میشود و کاربر در تمام طول نشست به صورت وارد شده به وبسایت قرار دارد. نمودار زیر طرز کار نشستها در پروتکل HTTP را توضیح میدهد:
اینک که با مبانی اولیه طرز کار نشستها آشنا شدید، در ادامه مثالهایی عملی برای نمایش چگونگی ایجاد متغیرهای نشست و دستکاری آنها ارائه میکنیم.
چگونه یک نشست را آغاز کنیم؟
در این بخش شیوه آغاز یک نشست را در PHP بررسی میکنیم. هر زمان که بخواهید با متغیرهای نشست سروکار داشته باشید، باید مطمئن شوید که یک نشست از قبل آغاز کردهاید. چندین روش برای آغاز یک نشست در PHP وجود دارند.
استفاده از تابع session_start
در این روش که غالباً مورد استفاده قرار میگیرد، یک نشست با استفاده از تابع session_start آغاز میشود:
<?php // start a session session_start(); // manipulate session variables ?>
نکته مهم این است که تابع session_start باید در آغاز اسکریپت و پیش از هر گونه خروجی در مرورگر فراخوانی شود. در غیر این صورت، با خطای بدنام «Headers are already sent» مواجه خواهید شد.
آغاز خودکار یک نشست
اگر لازم باشد که از نشستها در سراسر یک اپلیکیشن استفاده شود، شاید بهتر باشد که نشستها به طور خودکار بدون استفاده از تابع session_start ایجاد شوند.
یک گزینه پیکربندی به نام session.auto_start در فایل php.ini وجود دارد که امکان آغاز یک نشست به طور خودکار در هر درخواست را فراهم میسازد. به طور پیشفرض مقدار آن برابر با 0 است و میتوانید مقدار آن را برابر با 1 قرار دهید تا کارکرد آغاز خودکار فعال شود.
session.auto_start = 1
از سوی دیگر اگر میخواهید به فایل php.ini دسترسی داشته باشید و از وبسرور Apache استفاده میکنید، میتوانید این متغیر را با استفاده از فایل htaccess. تنظیم کنید:
php_value session.auto_start 1
اگر خط فوق را به فایل htaccess. اضافه کنید، وبسرور آپاچی در هر اپلیکیشن PHP به طور خودکار یک نشست را آغاز میکند.
شیوه دریافت شناسه نشست
همان طور که قبلاً اشاره کردیم، سرور شمارهای یکتا برای هر نشست ایجاد میکند. اگر میخواهید شناسه نشست را دریافت کنید، میتوانید از تابع session_id استفاده کنید که در قطعه کد زیر نمایش یافته است:
<?php session_start(); echo session_id(); ?>
بدین ترتیب شناسه نشست کنونی را به دست میآورید. تابع session_id به این دلیل جالب توجه است که یک آرگومان میگیرد که آن هم شناسه نشست است. اگر میخواهید شناسه نشست ایجاد شده از سوی سیستم را با مقداری که خودتان تعیین میکنید، تغییر دهید میتوانید آن را در آرگومان نخستِ تابع session_id ارسال کنید:
<?php session_id(YOUR_SESSION_ID); session_start(); ?>
توجه به این نکته نیز حائز اهمیت است که هر زمان بخواهید یک نشست با شناسه نشست سفارشی ایجاد کنید، تابع session_id باید پیش از فراخوانی session_start قرار گیرد.
شیوه ایجاد متغیرهای نشست
در این بخش شیوه مقداردهی اولیه تغیرهای نشست در PHP را بررسی میکنیم. همان طور که قبلاً اشاره کردیم زمانی که نشست آغاز میشود آرایه سوپرگلوبال SESSION_$ با اطلاعات مربوط به نشست، مقداردهی اولیه میشود. به طور پیشفرض این آرایه به صورت یک آرایه خالی است که میتواند اطلاعات را با استفاده از یک جفت کلید-مقدار ذخیره کند. در مثال زیر شیوه مقداردهی اولیه متغیرهای نشست نمایش یافته است:
<?php // start a session session_start(); // initialize session variables $_SESSION['logged_in_user_id'] = '1'; $_SESSION['logged_in_user_name'] = 'Tutsplus'; // access session variables echo $_SESSION['logged_in_user_id']; echo $_SESSION['logged_in_user_name']; ?>
همان طور که میبینید یک نشست را در ابتدای قطعه کد با استفاده از تابع session_start آغاز کردهایم. متعاقب آن چند متغیر نشست را مقداردهی اولیه کردهایم. در نهایت با استفاده از آرایه سوپرگلوبال SESSION_$ مقدار آنها را خواندهایم.
زمانی که دادهها را با استفاده از آرایه سوپرگلوبال SESSION_$ در یک نشست ذخیره میکنید، این اطلاعات نهایتاً در فایل مربوطه که در ابتدای آغاز نشست در سرور ایجاد شده است ذخیره خواهند شد. بدین ترتیب دادههای نشست، در میان درخواستهای مختلف کاربر به اشتراک گذارده میشود.
همان طور که قبلاً اشاره کردیم، اطلاعات نشستِ کاربر در میان درخواستهای مختلف به اشتراک گذارده میشود و از این رو متغیرهای نشست که در یک صفحه مقداردهی اولیه شدهاند، میتوانند در صفحههای دیگری تا زمانی که نشست منقضی نشده است، مورد دسترسی قرار گیرند. به طور کلی نشست زمانی که مرورگر بسته شود منقضی میشود.
شیوه ویرایش یا حذف متغیرهای نشست
متغیرهای نشست که قبلاً در اپلیکیشن ایجاد شدهاند را میتوان مانند هر متغیر دیگر PHP ویرایش یا حذف کرد. در ادامه روش ویرایش متغیرهای نشست را مشاهده میکنید:
<?php session_start(); if (!isset($_SESSION['count'])) { $_SESSION['count'] = 1; } else { ++$_SESSION['count']; } echo $_SESSION['count']; ?>
در اسکریپت فوق ما بررسی میکنیم که آیا متغیر ['SESSION[‘count_$ کلاً تعیین شده است یا نه. اگر جنین نباشد مقدار آن را برابر با 1 تعیین میکنیم. در غیر این صورت مقدار آن را به 1 افزایش میدهیم. بنابراین هر بار که صفحه را رفرش کنید میبینید که این مقدار 1 واحد افزایش مییابد.
از سوی دیگر اگر بخواهید متغیر نشست را حذف کنید، میتوانید از تابع unset استفاده کنید که روش استفاده از آن در قطعه کد زیر نمایش یافته است:
<?php // start a session session_start(); // initialize a session variable $_SESSION['logged_in_user_id'] = '1'; // unset a session variable unset($_SESSION['logged_in_user_id']); ?>
بنابراین دیگر به متغیر ['SESSION[‘logged_in_user_id_$ دسترسی نخواهید داشت، زیرا از سوی تابع unset حذف شده است. بدین ترتیب میتوان اطلاعات نشست را تغییر داد.
شیوه از بین بردن یک نشست
در این بخش با شیوه از بین بردن یک نشست آشنا میشویم. در بخش قبلی تابع unset را که در موارد نیاز به حذف متغیرهای نشست مورد استفاده قرار میگیرد، معرفی کردیم. در سوی دیگر در برخی موارد لازم است که همه اطلاعات مرتبط با نشست به یکباره حذف شوند. در چنین مواردی میتوانید از تابع session_destroy استفاده کنید.
روش استفاده از آن را در قطعه کد زیر مشاهده میکنید:
<?php // start a session session_start(); // assume that we’ve initialized a couple of session variables in the other script already // destroy everything in this session session_destroy(); ?>
تابع session_destroy هر چیزی که کاربر در نشست کنونی ذخیره کرده است را پاک میکند. از این رو پس از فراخوانی این تابع با یک متغیر SESSION_$ کاملاً خالی مواجه میشویم، چون دادههای نشست که روی دیسک بودند به وسیله این تابع حذف شدهاند. به طور کلی موارد استفاده از تابع session_destroy زمانی است که کاربر میخواهد از وبسایت یا اپلیکیشن خارج شود.
سخن پایانی
در این مقاله مبانی اولیه مدیریت نشست در PHP را بررسی کردیم. مدیریت نشست مفهومی کلیدی است که امکان حفظ اطلاعات در میان صفحههای مختلف وبسایت را فراهم میسازد. در نیمه نخست این مقاله به بررسی مفهوم نشستها پرداختیم و در نیمه دوم نمونههایی از کدهای PHP ارائه کردیم که به طور عملی روش ایجاد و تخریب نشستها و همچنین روش دستکاری متغیرهای نشست را نمایش میدادند.
اگر این مطلب برایتان مفید بوده است، آموزشهایی که در ادامه آمدهاند نیز به شما پیشنهاد میشوند:
- برنامهنویسی PHP و هر آنچه برای شروع باید بدانید — آموزش جامع
- آموزش کار با دیتابیس در فریمورک PHP کدایگنایتر – CodeIgniter
- مجموعه آموزشهای برنامهنویسی
- گنجینه برنامه نویسی PHP
- آموزش فریمورک PHP کدایگنایتر (CodeIgniter)
- مجموعه آموزش های PHP
==
با سلام در سایت وردپرسی من ی خطا نمایش داده میشه به عنوان
نشست PHP توسط یک session_start() فراخوانی تابع ایجاد شده است. این با REST API و درخواستهای حلقهبازگشت تداخل میکند. این نشست باید توسط session_write_close() قبل از ایجاد هر درخواست HTTP بسته شود. منظور چیست؟
من هم مشکل رضا جان رو دارم. در بخش وضعیت سلامت وردپرس. و هیچ اطلاعات دیگه ای رو برام در نظر نگرفته.
با سلام؛
دوست عزیز اطلاعاتی که به ما ارائه کردید، برای پاسخ به سوال ناکافی است. به طور اجمالی اگر خودتان تابع آغاز نشست را به یک بخش از سایت اضافه کردهاید، باید این کار را خارج از حلقه فراخوانی پستها انجام دهید. اگر این خطا را در نتیجه افزودن یک افزونه به سایت وردپرس مشاهده میکنید، باید آن افزونه را غیر فعال کنید، چون به طور صحیحی کدنویسی نشده است.
از توجه شما متشکریم.