
سشن در PHP به ما کمک میکند اطلاعات کاربر را سمت سرور نگه داریم. مثلاً وضعیت ورود کاربر، نام، id یا سطح دسترسی کاربر را ذخیره کنیم یا متغیرهایی را بین صفحات سایت خودمان منتقل کنیم. در این آموزش کار با session در PHP و ۲ ترفند پرکاربردش را یاد میگیریم.
وقتی یک پنجره از نرمافزاری را روی سیستم عامل خود باز میکنیم، یک نشست (session یا سِشِن) ایجاد میکنیم. سیستم عامل و برنامه در تمام صفحات خودش متوجه میشود که ما کدام کاربر هستیم و اطلاعات مربوط به ما را نمایش میدهد. به این ویژگی، اصطلاحاً دارای وضعیت بودن (stateful) گفته میشود.
اینترنت و پروتکل HTTP بدون وضعیت است، یعنی سرور نمیتواند تفاوت درخواستی که از سمت من به سبز دانش ارسال میشود را با شما تشخیص دهد!
به کمک سشن در PHP میتوانیم این ویژگی را به اسکریپتها اضافه کنیم. به همین دلیل است که وقتی در یک سایت لاگین میکنیم، تا مدتی نیاز به لاگینِ مجدد نیست. 🙂
فهرست محتوای آموزش
تعریف سشن در PHP
وقتی یک سشن ایجاد میکنیم، سه اتفاق میافتد:
- یک شناسه منحصربهفرد توسط PHP ایجاد میشود. (اصطلاحاً identifier) این شناسه یک رشته PHP بهصورت هگزادسیمال است.
- یک فایل با همین نام در بخشی از سرور ایجاد میشود تا اطلاعات مورد نظرمان در آن نگهداری شود.
- یک کوکی به نام PHPSESSID با مقدار شناسهای که ایجاد شده در مرورگر کاربر تعریف میشود.
بهطور پیشفرض اطلاعات سشن در یک فایل ذخیره میشود. در پروژههای حرفهای و سنگین، با انجام تنظیماتی میتوانیم اطلاعات را در دیتابیس نیز ذخیره کنیم. شما فعلاً همان روش فایلی را در نظر بگیرید.
میدانیم که کوکیها همراه با درخواستهای مرورگر به سایت ارسال میشوند. بنابراین سرور میتواند تشخیص دهد که این درخواست مربوط به کدام کاربر است و اطلاعات او را فراخوانی کند.

تفاوت سشن و کوکی
از کوکی در PHP برای ذخیره اطلاعات در مرورگر کاربر استفاده میکنیم. اینطوری کاربر میتواند مقدار کوکی را تغییر داده یا مشاهده کند. در سشن PHP، اطلاعات در سمت سرور ذخیره میشود و صرفاً کد شناسایی در مرورگر قرار دارد. یعنی کاربر نمیتواند اطلاعات session را مشاهده یا ویرایش کند.
معمولاً طول عمر سشن از کوکی کمتر است. کوکیها تا زمان انقضا یا حذف شدنشان از مرورگر باقی میمانند؛ اما وقتی آخرین صفحه از سایت را میبندیم، پس از مدت زمان مشخصی، سشنهای PHP در سمت سرور حذف میشوند. بنابراین sessionها موقتی هستند.
به زبان ساده، از سشن برای نگهداری اطلاعات مهمتر (نسبت به کوکی) مربوط به کاربر، پردازشهای خودمان یا حتی انتقال اطلاعات بین چند صفحه از سایت استفاده میشود.
کار با سشن در PHP
حالا که فهمیدیم session چگونه کار میکند، بیایید یاد بگیریم چطور از آنها استفاده کنیم. ۴ کار کلی با سشنها میتوانیم انجام دهیم:
- شروع یک سشن
- ایجاد، تعریف و مقداردهی سشنها
- فراخوانی و تغییر نشست
- حذف session
ایجاد php session
برای شروع یک نشست در PHP از تابع session_start()
استفاده میشود. این تابع در ابتدا بررسی میکند که آیا قبلاً نشستی برای کاربر (ارتباط) فعلی ایجاد شده یا نه، اگر نشستی ایجاد نشده بود، فرآیند ایجاد نشست انجام شده و با ارسال کوکی session آغاز میشود.
<?php session_start(); ?>
وقتی سشن ایجاد شد، میتوانیم مقادیر مورد نظرمان را در آن بریزیم. یک متغیر سراسری در PHP به نام $_SESSION
داریم. این متغیر یک آرایه است که میتواند مقادیر مختلفی داشته باشد.
برای تعریف یک مقدار جدید در نشست (تعریف متغیر در سشن) کافی است آرایه را با کلید و مقدار مورد نظر مقداردهی کنیم. در قطعه کد زیر، پس از ایجاد سشن، مقداری user_id
را برابر 21 در نظر گرفتهام.
<?php
session_start();
$_SESSION['user_id'] = 21;
?>
اکثراً پیشنهاد میشود session_start()
در ابتدای بارگذاری صفحه استفاده شود. یعنی قبل از این تابع نباید هیچ خروجی متنی (نظیر تگ html) ایجاد شده باشد. اگر این اتفاق بیفتد ممکن است با خطایی مشابه خطای زیر مواجه شوید:
Warning: Cannot modify header information - headers already sent
فراخوانی و تغییر سشن
وقتی یک مقدار در سشن تعریف شد، میتوانیم از آن در تمام صفحات دیگر نیز استفاده کنیم. دسترسی به مقدار سشن در PHP نیز دقیقاً مشابه صدا زدن یکی از عناصر آرایه $_SESSION
است.
مثلاً اگر در صفحه دیگری از سایت قطعه کدی مشابه زیر را اجرا کنم، مقدار id که 21 است به من نمایش داده خواهد شد:
<?php
// another page
session_start();
echo $_SESSION['user_id']; // 21
?>
برای تغییر مقدار سشن هم میتوانیم مشابه تعریف سشن جدید، آن را دستکاری کنیم. در قطعه کد زیر، مقدار id را تغییر داده و یک مقدار جدید دیگر در نشست PHP تعریف میکنم:
<?php
session_start();
$_SESSION['user_id'] = 99;
$_SESSION['uesr'] = "omid@sabzdanesh";
$_SESSION['is_login'] = false;
?>
میبینید که مقادیری که در سشنها ذخیره میشوند میتوانند هر کدام از ۸ نوع دادهای متغیر در PHP باشند. پس به راحتی میتوانید هر چیزی در آن نگهداری کنید.
یادتان باشد که بهتر است session_start()
را در ابتدای صفحه و قبل از هرگونه خروجی صدا بزنید.
حذف سشن PHP
برای حذف session در PHP سه راه داریم که هر کدام نیاز خاصی را برطرف میکنند.
اولین روش حذف سشن، حذف یکی از مقادیر درون session است. از این روش وقتی استفاده میکنیم که میخواهیم فقط یکی از مقادیر درون $_SESSION
را حذف کنیم.
برای این کار، از تابع unset()
کمک میگیریم. احتمالاً از جلسه کار با آرایهها یادتان هست که این تابع PHP مقدار و اندیس (کلید) مورد نظر را از درون آرایه حذف میکند.
<?php unset( $_SESSION['is_login'] ); ?>
روش دوم، حذف تمام متغیرهای session است. وقتی چندین متغیر در آرایه سشن داریم و میخواهیم همه آنها را یکجا حذف کنیم، از تابع session_unset()
کمک میگیریم.
session_unset();
در روش سوم، علاوه بر حذف تمام متغیرها، به نشست پایان میدهیم. یعنی با صدا زدن تابع session_destroy()
تمام متغیرهای سشن PHP و فایل نگهداری آنها حذف میشود.
<?php session_destroy(); ?>
ترفندهای کار با سشن + مثال
هر آن چه که نیاز بود برای کار با سشن در PHP بدانید را یاد گرفتید! 🙂 در این بخش یک مثال کوچک و خیلی ساده از استفاده این توابع میزنم تا برایتان مرور شود.
میخواهیم یک شمارنده بازدید صفحه برای هر کاربر ایجاد کنیم. با هر بار رفرش صفحه، شمارنده بازدید افزایش پیدا میکند. همچنین یک لینک قرار میدهیم تا شمارنده را ریست کند.
بعد از آغاز نشست، باید بررسی کنیم که آیا شمارنده از قبل برای این کاربر تعریف شده یا نه. دقت کنید که اگر سشنی را صدا بزنیم که وجود ندارد، با خطای Undefined Index مواجه میشویم. (حرفهایتر شوید: مدیریت استثنا یا خطا در PHP)
برای بررسی وجود متغیر در نشست از isset()
استفاده میکنم. به کمک if در PHP کد زیر را مینویسم:
<?php
session_start();
if( isset($_SESSION['counter']) ){
$_SESSION['counter'] += 1;
}else{
$_SESSION['counter'] = 1;
}
echo "شما {$_SESSION['counter']} دفعه صفحه را دیدهاید.";
?>
حالا یک لینک ساده برای ریست شمارنده قرار میدهم. در این کار از روش ارسال داده با get در PHP استفاده میکنم.
<?php
session_start();
if( isset($_GET['reset']) || !isset($_SESSION['counter']) ){
$_SESSION['counter'] = 1;
}else{
$_SESSION['counter'] += 1;
}
echo "شما {$_SESSION['counter']} دفعه صفحه را دیدهاید.";
echo '<br><a href="?reset=1">ریست</a>';
?>
در این کد از عملگر ! برای منفی کردن و || بهمعنی «یا» استفاده کردهام. (انواع عملگر در PHP) نتیجه این کد ساده، چیزی شبیه زیر میشود:

تمرین یادگیری سشن PHP
اگر جلسه ایجاد فرم با PHP را گذراندهاید، پیشنهاد میکنم همین الآن یک فرم ورود ایجاد کنید. اعتبارسنجی این فرم میتواند با اتصال به دیتابیس PHP انجام شود یا صرفاً یک نام کاربری و رمز عبور در کد برایش بنویسید.
حالا به کمک سشنها در سایر صفحات سایتتان، ۲ پیام مختلف نشان دهید: اگر لاگین نشده بودیم، دکمه ورود نمایش داده شود و در صورتی که وارد شده بود به کاربر سلام کنیم؛ مثل «سلام امید!»
در مستندات انگلیسی مثالهای مختلفی برای کاربردهای مختلف وجود دارد که اگر علاقه دارید میتواند منبع خوبی باشد. امیدوارم با مفهوم session و نحوه کار با آن به خوبی آشنا شده باشید. اگر سؤالی دارید، بخش نظرات برای شماست.
این آموزش بخشی از یک آموزش جامع و قدم به قدم در سبز دانش است: دوره رایگان آموزش PHP
این آموزش برای همیشه رایگانه! میتونید با اشتراکگذاری لینک این صفحه از ما حمایت کنید یا با خرید یه فنجون نوشیدنی بهمون انرژی بدید!
میخوام یه نوشیدنی مهمونتون کنم
سلام
سپاس از اموزشهای عالیی
من خطای یک نشست فعال php پیدا شد توی وردپرس میگیرم. چطور رفعش کنم؟
سلام
اخیراً قالب یا افزونههاتون رو آپدیت کردید؟ این هشدار معمولاً به خاطر تداخل یا مشکل در اجرای بعضی کدها رخ میده.
پیشنهاد اینکه قالب و افزونهها رو دونه دونه غیرفعال کنید ببینید مشکل از کجاست.
سپاس برای توضیحات خوبتون
جای یه فیلم اموزشی خالیه!
ممنون بابت پیشنهادتون. در حال تهیه ویدئوهای آموزشی هستیم؛ به زودی منتشر میشه.
سلام؛
من یک مدتی هست تو قسمت سلامت سایتم به مشکلی خوردم مبنی بر این:
یک نشست فعال PHP پیدا شد
نشست PHP توسط یک
session_start()
فراخوانی تابع ایجاد شده است. این با REST API و درخواستهای حلقهبازگشت تداخل میکند. این نشست باید توسطsession_write_close()
قبل از ایجاد هر درخواست HTTP بسته شود.اما من هرکاری کردم عملا نتوانستم این مشکل را حل کنم.
و همین مشکل بحرانی، باعث ایجاد مشکلات دیگر از جمله خطای REST API و کامل نشدن درخواست loopback شده است.
لطفا راهنمایی کنید از کدام قسمت باید این مشکل را حل کنم و نشست را ببندم.
البته بنده کدنویسی بلد نیستم و متوجه نشدم این آموزش را در کدام قسمت و به چه شکلی باید اجرا کرد؛ خواهشمندم کمک کنید و بیشتر توضیح دهید.
متشکرم
سلام
ظاهراً CMS شما وردپرس هست. این مورد میتونه از تداخل پلاگینها یا مشکل در قالبی که استفاده میکنید باشه!
نمیشه نظر دقیقی داد اما معمولاً چنین چیزی مرتبط با بخشهای کاربری یا فروشگاهی هست.
پیشنهاد میکنم یک نسخه پشتیبان از سایت تهیه کنید و سپس یکی یکی افزونهها و در نهایت قالب رو غیرفعال کنید تا منبع مشکل پیدا بشه.
موفق باشید.
سلام مجدد
خوب من چطور میتونم نسخه پشتیبان رو تهیه کنم؟
و اینکه ی بار شروع کردم حدودا دونه دونه تا نصف افزونه ها رو غیر فعال کردم.
بله ورد پرس هست که اخیرا هم بروزرسانی کردم و افزونه فروشگاهیم هم ووکامرس هس.
درود
برای گرفتن بکاپ از داخل کنترل پنل سایتتون اقدام کنید بهتره و یا با پشتیبانی هاست تماس بگیرید تا براتون انجام بدن.
همین کاری که کردید رو ادامه بدید. تک تک افزونهها رو غیرفعال کنید و در نهایت قالب رو تغییر بدید (ترججیحاً به 2020 پیشفرض وردپرس) تا منشأ مشکل رو پیدا کنید.
موفق باشید.
[…] در مورد نشست یا سشن کسب کنید، شما را به مطالعه مقاله سشن در PHP دعوت […]