سشن در 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! دلیلشم ماندگاری اطلاعاتتون هست.
سلام
من کدتون را زدم ولی مقدارش افزوده نمیشه
سلام
مقداری در قسمت سشنهای مرورگر ذخیره میشه؟ اگه آره، وقتی دستی تغییرش بدید هم تغییر میکنه یا نه؟
بعضی وقت ها کار میکنه ولی بعضی وقتا نه.
وقتی تو فایرفاکس امتحان میکنم مشکلی نیست ولی در کروم هرزگاهی باگ پیدا میکنه
اگه توی فایرفاکس درسته پس کد هم نباید مشکلی داشته باشه. از همین بخش مرورگر که توی آموزش گفته شده چک کنید ببینید چه زمان توی کروم به مشکل میخوره و وقتی اینطوری میشه مقدارش مشکلدار میشه یا حذف میشه یا چی؟ اینطوری دلیلش رو بهتر میتونید پیدا کنید.
سلام وقت بخیر
چطور اطلاعات سشن رو روی یک صفحه دیگه نمایش بدیم؟؟؟
سلام
شما با همین متغیر سراسری
$_SESSION
میتونید در سایر صفحات هم به مقدار موردنظرتون دسترسی داشته باشید.فقط حواستون باشه برای جلوگیری از خطای ناخواسته، حتماً وجودش رو بررسی کنید.
سلام وقت بخیر
توضیحات سایت شما خیلی قابل فهم ،جامع وکامل هست و واقعا عالیه
خوشحالم که از آموزشهامون برای پیشرفت خودتون استفاده میکنید نادیای عزیز 🙂
موفق باشی
سلام
سپاس از اموزشهای عالیی
من خطای یک نشست فعال php پیدا شد توی وردپرس میگیرم. چطور رفعش کنم؟
سلام
اخیراً قالب یا افزونههاتون رو آپدیت کردید؟ این هشدار معمولاً به خاطر تداخل یا مشکل در اجرای بعضی کدها رخ میده.
پیشنهاد اینکه قالب و افزونهها رو دونه دونه غیرفعال کنید ببینید مشکل از کجاست.
سپاس برای توضیحات خوبتون
جای یه فیلم اموزشی خالیه!
ممنون بابت پیشنهادتون. در حال تهیه ویدئوهای آموزشی هستیم؛ به زودی منتشر میشه.
سلام؛
من یک مدتی هست تو قسمت سلامت سایتم به مشکلی خوردم مبنی بر این:
یک نشست فعال PHP پیدا شد
نشست PHP توسط یک
session_start()
فراخوانی تابع ایجاد شده است. این با REST API و درخواستهای حلقهبازگشت تداخل میکند. این نشست باید توسطsession_write_close()
قبل از ایجاد هر درخواست HTTP بسته شود.اما من هرکاری کردم عملا نتوانستم این مشکل را حل کنم.
و همین مشکل بحرانی، باعث ایجاد مشکلات دیگر از جمله خطای REST API و کامل نشدن درخواست loopback شده است.
لطفا راهنمایی کنید از کدام قسمت باید این مشکل را حل کنم و نشست را ببندم.
البته بنده کدنویسی بلد نیستم و متوجه نشدم این آموزش را در کدام قسمت و به چه شکلی باید اجرا کرد؛ خواهشمندم کمک کنید و بیشتر توضیح دهید.
متشکرم
سلام
ظاهراً CMS شما وردپرس هست. این مورد میتونه از تداخل پلاگینها یا مشکل در قالبی که استفاده میکنید باشه!
نمیشه نظر دقیقی داد اما معمولاً چنین چیزی مرتبط با بخشهای کاربری یا فروشگاهی هست.
پیشنهاد میکنم یک نسخه پشتیبان از سایت تهیه کنید و سپس یکی یکی افزونهها و در نهایت قالب رو غیرفعال کنید تا منبع مشکل پیدا بشه.
موفق باشید.
سلام مجدد
خوب من چطور میتونم نسخه پشتیبان رو تهیه کنم؟
و اینکه ی بار شروع کردم حدودا دونه دونه تا نصف افزونه ها رو غیر فعال کردم.
بله ورد پرس هست که اخیرا هم بروزرسانی کردم و افزونه فروشگاهیم هم ووکامرس هس.
درود
برای گرفتن بکاپ از داخل کنترل پنل سایتتون اقدام کنید بهتره و یا با پشتیبانی هاست تماس بگیرید تا براتون انجام بدن.
همین کاری که کردید رو ادامه بدید. تک تک افزونهها رو غیرفعال کنید و در نهایت قالب رو تغییر بدید (ترججیحاً به 2020 پیشفرض وردپرس) تا منشأ مشکل رو پیدا کنید.
موفق باشید.
سلام. ممنون از سایت خوبتون.
من یه مشکل بعد از آپلود اطلاعات روی هاست برام پیش اومد که تا قبل از اون روی سیستم خودم وجود نداشت. اینکه برای ورود مدیر به پنل مدیریت مدیر رو تشخیص نمیده. من به متغیر سیشن مقدار میدم بعد از تشخیص درست بودن یوزر و پسورد مدیر. صفحه مدیریت ست بودن مقدار سیشن رو بررسی میکنه و در صورتی که ست نشده باشه پیغام شما مدیر نیستید میده. متاسفانه برای من بعد از وارد کردن یوزر و پس مدیر هم پیغام شما مدیر نیستید میده. یعنی انگار اصلا ست نمیشه متغیر سیشن.
ممنون میشم اگه راهنماییم کنید تا مشکلم حل بشه
سلام
احتمالش کمه، ولی چک کنید Host شما از sessionها پشتیبانی میکنه یا نه؟
با اجرای
phpinfo()
میتونید بخش sessionها رو ببینید که آیا enabled هست یا نه.اگه فعاله، یه سشن معمولی توی یه صفحه خالی (غیر از پروژهتون) تعریف کنید ببینید آیا تعریف و فراخوانی میشه یا نه؟
[…] در مورد نشست یا سشن کسب کنید، شما را به مطالعه مقاله سشن در PHP دعوت […]