آموزش نشست، سشن یا session در PHP

سشن در PHP به ما کمک می‌کند اطلاعات کاربر را سمت سرور نگه داریم. مثلاً وضعیت ورود کاربر، نام، id یا سطح دسترسی کاربر را ذخیره کنیم یا متغیرهایی را بین صفحات سایت خودمان منتقل کنیم. در این آموزش کار با session در PHP و ۲ ترفند پرکاربردش را یاد می‌گیریم.

وقتی یک پنجره از نرم‌افزاری را روی سیستم عامل خود باز می‌کنیم، یک نشست (session یا سِشِن) ایجاد می‌کنیم. سیستم عامل و برنامه در تمام صفحات خودش متوجه می‌شود که ما کدام کاربر هستیم و اطلاعات مربوط به ما را نمایش می‌دهد. به این ویژگی، اصطلاحاً دارای وضعیت بودن (stateful) گفته می‌شود.

اینترنت و پروتکل HTTP بدون وضعیت است، یعنی سرور نمی‌تواند تفاوت درخواستی که از سمت من به سبز دانش ارسال می‌شود را با شما تشخیص دهد!

به کمک سشن در PHP می‌توانیم این ویژگی را به اسکریپت‌ها اضافه کنیم. به همین دلیل است که وقتی در یک سایت لاگین می‌کنیم، تا مدتی نیاز به لاگینِ مجدد نیست. 🙂

تعریف سشن در PHP

وقتی یک سشن ایجاد می‌کنیم، سه اتفاق می‌افتد:

  • یک شناسه منحصربه‌فرد توسط PHP ایجاد می‌شود. (اصطلاحاً identifier) این شناسه یک رشته PHP به‌صورت هگزادسیمال است.
  • یک فایل با همین نام در بخشی از سرور ایجاد می‌شود تا اطلاعات مورد نظرمان در آن نگهداری شود.
  • یک کوکی به نام PHPSESSID با مقدار شناسه‌ای که ایجاد شده در مرورگر کاربر تعریف می‌شود.

به‌طور پیشفرض اطلاعات سشن در یک فایل ذخیره می‌شود. در پروژه‌های حرفه‌ای و سنگین، با انجام تنظیماتی می‌توانیم اطلاعات را در دیتابیس نیز ذخیره کنیم. شما فعلاً همان روش فایلی را در نظر بگیرید.

می‌دانیم که کوکی‌ها همراه با درخواست‌های مرورگر به سایت ارسال می‌شوند. بنابراین سرور می‌تواند تشخیص دهد که این درخواست مربوط به کدام کاربر است و اطلاعات او را فراخوانی کند.

مقدار کوکی PHPSESSID سشن در PHP
مقدار کوکی PHPSESSID سشن در PHP

تفاوت سشن و کوکی

از کوکی در 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 و ترفندهای کار با آرایه

آموزش آرایه در PHP و ترفندهای کار با آرایه

فراخوانی و تغییر سشن

وقتی یک مقدار در سشن تعریف شد، می‌توانیم از آن در تمام صفحات دیگر نیز استفاده کنیم. دسترسی به مقدار سشن در 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