Sessionها یکی از مفاهیم کلیدی در زبان PHP هستند و نقش مهمی در توسعه وب دارند. با استفاده از Session در PHP می‌توان اطلاعات و داده‌های مربوط به کاربر را در سمت سرور ذخیره کرد که همین عامل به حفظ تعاملات کاربر و افزایش امنیت برنامه‌های مبتنی بر PHP کمک می‌کند. در مطلب پیش‌رو از مجله فرادرس به این سوال پاسخ داده شده است که جنبه‌های کلیدی Session در PHP چیست و چگونه می‌توان آن را پیاده‌سازی کرد. با مطالعه این مطلب نحوه ایجاد Session، ذخیره‎‌سازی اطلاعات به کمک آن و نحوه حذف کردن آن را خواهید آموخت.

فهرست مطالب این نوشته

در این مطلب سعی شده است تا ضمن آموزش Session به زبان ساده نحوه استفاده موثرتر و نکات امنیتی مهم آن نیز عنوان شود. علاوه بر این به سوالات مهم این حوزه به منظور رفع ابهامات نیز پاسخ داده شده است.

Session در PHP‌ چیست؟

session در PHP مکانیزمی برای ذخیره‌سازی موقت داده‌ها و اطلاعات مربوط به کاربر در مرورگر را فراهم می‌کند. با استفاده از session می‌توان اطلاعات کاربر همچون نام کاربری، شناسه، ایمیل و سایر موارد را در متغیرهای مختلف ذخیره کرد و امکان دسترسی به این اطلاعات از طریق همه صفحات وب‌سایت نیز وجود دارد.

به زبان ساده session فایل موقتی را بر روی سرور ایجاد می‌کند و ذخیره‌سازی اطلاعات مورد نیاز را بر روی آن انجام می‌دهد که از طریق تمام صفحات وب‌سایت می‌توان به این اطلاعات دسترسی داشت.

دلیل استفاده از Session در PHP چیست؟

به منظور پاسخ به این سوال که دلیل استفاده از Session در PHP چیست باید نحوه عملکرد پروتکل HTTP را مورد بررسی قرار داد. پروتکل HTTP یک پروتکل «بدون حالت» (Stateless) است. در نتیجه، سرور امکان شناسایی یک کاربر خاص در بین چندین درخواست را ندارد. به عنوان مثال، در زمان دسترسی به صفحه‌ای خاص از وب‌سایت توسط کاربر سرور تنها مسئول ارائه اطلاعات صفحه درخواستی است. بنابراین، اگر کاربر قصد دسترسی به سایر صفحات وب‌سایت را داشته باشد، آنگاه وب سرور هر درخواست را به طور جداگانه تفسیر می‌کند و ارتباط بین درخواست‌ها را متوجه نخواهد شد. تصویر زیر نحوه ارتباط بین کلاینت و سرور مبتنی بر پروتکل HTTP را نشان می‌دهد.

نحوه ارتباط کلاینت و سرور مبتنی بر پروتکل HTTP

با توجه به مدل ارائه شده در بالا در هر خواست باید احراز هویت کاربر صورت بگیرد. برای درک بهتر این موضوع شرایطی را در نظر بگیرید که برای بازدید از هر صفحه وب‌سایت باید نام کاربری و کلمه عبور خود را وارد کنید. این کار عملاً غیرممکن و نشدنی به نظر می‌رسد. بنابراین، استفاده از Session در PHP امکان دسترسی به اطلاعات کاربر را فراهم می‌کند و سرور امکان شناسایی کاربر در هر درخواست را خواهد داشت.

کاربرد Session در PHP چیست؟

برنامه نویسان از Session در PHP می‌توانند به منظور ذخیره‌سازی اطلاعات مربوط به زمان راه‌اندازی وب‌سایت، کارهای انجام شده توسط کاربر در سایت، زمان بستن وب‌سایت و سایر اطلاعات مرتبط در وب سرور استفاده کنند. وجود این قابلیت بسیار ضروری است، زیرا وب سرور برخلاف رایانه شخصی یا تلفن همراه هیچ گونه اطلاعاتی از کاربر ندارد. در نتیجه، وجود Session به منظور ذخیره‌سازی این اطلاعات ضروری است.

برنامه نویس پشت لپ تاپش نشسته و در حالی طراحی سایت برای ذخیره‌سازی اطلاعات است و نور ملایمی نیز از پنجره به داخل می تابد - Session در PHP

Sessionها دارای متغیرهایی هستند که امکان ذخیره‌سازی اطلاعات در یک فایل موقت را فراهم می‌کنند. به صورت پیش‌فرض با بستن وب‌سایت توسط کاربر این فایل از بین می‌رود. به زبان ساده Session در PHP سازوکاری برای ذخیره‌سازی اطلاعات کاربران ایجاد می‌کند و داده‌ها را تا زمان بستن صفحات وب‌سایت در دسترس قرار می‌دهد.

با راه‌اندازی Session در PHP چه اتفاقاتی رخ می‌دهد؟

همزمان با راه‌اندازی Session اتفاقاتی زیر رخ می‌دهد:

  • یک عدد تصادفی ۳۲ رقمی هگزادسیمال به عنوان شناسه یا Session ID برای Session مورد نظر ایجاد می‌شود. شناسه مورد نظر عددی مشابه «4af5ac6val45rf2d5vre58sd648ce5f7» خواهد بود.
  • یک کوکی با نام PHPSESSID به سیستم کاربر ارسال می‌شود که مقدار Session ID درون این کوکی ذخیره خواهد شد.
  • فایل موقتی بر روی سرور ایجاد و در دایرکتوری مشخصی ذخیره می‌شود. نام این فایل از ترکیب Session ID با پیشوند sess_ تعیین می‌شود.

PHP به کوکی PHPSESSID دسترسی دارد و شناسه منحصر به فرد Session ID را برای دریافت متغیرهای Session دریافت می‌کند. با بستن مرورگر یا وب‌سایت Session ایجاد شده بعد از یک دوره زمانی مشخص خاتمه پیدا می‌کند.

cookie و session دو اصطلاح و مفهوم بسیار نزدیک به یکدیگر هستند و معمولاً نیز به اشتباه یکسان در نظر گرفته می‌شوند. با استفاده از cookie و session می‌توان اطلاعات مربوط به کاربر را در متغیرهای مختلف ذخیره کرد. تفاوت اصلی cookie و session در این است که متغیرهای session در سمت سرور ذخیره می‌شوند و در نقطه مقابل ذخیره‌سازی متغیرهای cookie در مرورگر کاربر صورت می‌گیرد. متغیرهای session به منظور ردیابی فعالیت‌های کاربر مورد استفاده قرار می‌گیرند و کوکی‌ها به منظور ذخیره اطلاعات کاربر برای سایت استفاده می‌شوند.

برنامه‌نویس ایستاده رو به دیوار در حال بررسی تفاوت های cookie و Session در PHP

چگونه با PHP وب سایت طراحی کنیم؟

PHP زبان برنامه نویسی قدرتمند و همه کاره‌ای است که به منظور توسعه وب‌سایت‌ها و وب اپلیکیشن‌های کاربردی مورد استفاده قرار می‌گیرد. این زبان برنامه نویسی طیف گسترده‌ای از ساختارها و توابع مختلف را شامل می‌شود. به منظور یادگیری این زبان برنامه نویسی بهتر است ابتدا با اصول اولیه برنامه نویسی نظیر تعریف متغیر، نوع‌های داده‌ای، عملگرها، ساختارهای کنترلی، توابع و سایر موارد دیگر آشنا باشید. در گام بعدی باید به سراغ یادگیری سینتکس PHP بروید و قوانین و قواعد موجود در این زبان برنامه نویسی را به تدریج بیاموزید. اگر آشنایی چندانی با این زبان برنامه نویسی ندارید می‌توانید مسیر یادگیری خود را با مشاهده فیلم آموزش رایگان PHP فرادرس شروع کنید که لینک آن در زیر آورده شده است.

بعد از آشنایی با PHP و یادگیری مقدمات موجود در این زبان نیاز است تا با انجام مثال‌ها و پروژه‌های مختلف چرخه یادگیری خود را تکمیل کنید. خوشبختانه برای این منظور نیز دوره‌های آموزشی پروژه محور با کیفیتی در سایت فرادرس وجود دارد که به ترتیبی که در ادامه آورده شده است به شما پیشنهاد می‌شوند.

مجموعه آموزش‌ برنامه نویسی پی اچ پی PHP فرادرس

آموزش کار با Session در PHP‌

توانایی کار با sessionها امری ضروری است و برنامه‌نویسان PHP باید به خوبی با این مفهوم آشنایی داشته باشند. بر همین اساس در این بخش از نوشته سعی شده است به صورت گام‌به‌گام مراحل کار با Session در PHP گفته شود. یکی از موارد استفاده گسترده Sessionها در PHP پیاده‌سازی سازوکار لاگین و ثبت‌نام در سایت است. اگر به دنبال یادگیری پروژه محور مبحث Session در PHP هستید می‌توانید فیلم آموزش پروژه محور پیاده‌سازی انواع لاگین و ثبت‌نام در PHP فرادرس که لینک آن در ادامه آورده شده است را مشاهده کنید.

چگونه یک Session در PHP ایجاد کنیم؟

به منظور راه‌اندازی Session در PHP می‌توان تابع session_start()

 را فراخوانی کرد. این تابع ابتدا به صورت پیش‌فرض وجود داشتن یا نداشتن Session را بررسی می‌کند و در صورتی که Session از قبل وجود نداشته باشد آن را ایجاد می‌کند. قطعه کد زیر نحوه فراخوانی تابع session_start()

 را نشان می‌دهد.

1<?php
2// start a session 
3session_start();
4 
5// manipulate session variables 
6?>

نکته بسیار مهم در خصوص تابع session_start()

 این است که این تابع باید حتماً در ابتدای اسکریپت قبل از ارسال خروجی به مرورگر فراخوانی شود.

چگونه می‌توان Session را به صورت خودکار ایجاد کرد؟

در صورت نیاز به استفاده از session در تمام بخش‌های برنامه می‌توان بدون استفاده از تابع session_start()

 به صورت خودکار راه‌اندازی session را انجام داد. برای این منظور می‌توان از گزینه موجود در فایل پیکربندی php.ini

 استفاده کرد که اجازه اجرای خودکار session برای هر درخواستی را می‌دهد. به منظور فعال‌سازی اجرای خودکار session باید مقدار متغیر session.auto_start

 را که به صورت پیش‌فرض برابر 0 است را به 1 تغییر داد.

در صورت عدم دسترسی به فایل php.ini

 می‌توان از طریق وب سرور آپاچی و فایل .htaccess

 مقدار این متغیر را تغییر داد.

1php_value session.auto_start 1

با اضافه کردن دستور بالا به فایل .htaccess

 می‌توان session را به صورت خودکار در برنامه PHP اجرا کرد.

چگونه می‌توان Session ID را به دست آورد؟

سرور برای هر Session یک شناسه منحصر به فرد تحت عنوان Session ID ایجاد می‌کند. برای دریافت این شناسه می‌توان از تابع session_id()

 استفاده کرد که در قطعه کد زیر نشان داده شده است.

1<?php
2session_start();
3echo session_id();
4?>

اجرای تابع session_id()

 شناسه منحصر به فرد تولید شده یا همان Session ID را بر می‌گرداند. نکته جالب در خصوص تابع session_id()

 این است که می‌توان یک آرگومان را به عنوان ورودی به این تابع داد. در نتیجه، با استفاده از این آرگومان می‌توان شناسه تولید شده توسط سرور را با شناسه مشخص شده جایگزین کرد. قطعه کد زیر نحوه تنظیم Session ID را نشان می‌دهد.

1<?php
2session_id(YOUR_SESSION_ID);
3session_start();
4?>

برای تنظیم Session ID باید تابع session_id()

 قبل از دستور session_start()

 قرار داده شود.

چگونه می‌توان متغیرهای Session ایجاد کرد؟

همان طور که در ابتدای نوشته نیز عنوان شد امکان ذخیره‌سازی اطلاعات مختلف کاربر با استفاده از متغیرهای Session در PHP وجود دارد. بعد از راه‌اندازی Session یک آرایه با نام $_SESSION

 با دسترسی سراسری مقداردهی اولیه می‌شود. به طور پیش‌فرض این آرایه خالی است و می‌توان اطلاعات مورد نیاز را با استفاده از جفت‌های کلید و مقدار در آن ذخیره کرد. قطعه کد زیر نحوه مقداردهی متغیرهای Session در PHP را نشان می‌دهد.

1<?php
2// start a session 
3session_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 
10echo $_SESSION['logged_in_user_id'];
11echo $_SESSION['logged_in_user_name'];
12?>

در مثال بالا راه‌اندازی Session با فراخوانی تابع session_start()

 صورت گرفته است و در ادامه اطلاعات مورد نیاز درون متغیر آرایه سراسری $_SESSION

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

نحوه تغییر یا حذف متغیرهای Session به چه صورت است؟

بعد از ایجاد متغیرهای Session می‌توان همانند سایر متغیرهای PHP آن‌ها را تغییر داد یا حذف کرد. قطعه کد زیر نحوه تغییر متغیرهای Session را نشان می‌دهد.

1<?php
2session_start();
3 
4if (!isset($_SESSION['count']))
5{
6  $_SESSION['count'] = 1;
7}
8else
9{
10  ++$_SESSION['count'];
11}
12 
13echo $_SESSION['count'];
14?>

در مثال بالا با دستور شرطی if مقداردهی شدن متغیر $_SESSION[‘count’]

 مورد ارزیابی قرار می‌گیرد و در صورت مقداردهی نشدن مقدار 1 برای آن در نظر گرفته می‌شود. همچنین، در صورتی که متغیر از قبل تعریف شده باشد آنگاه مقدار آن یک واحد افزایش می‌یابد. بنابراین، با هر مرتبه بروزرسانی مرورگر مقدار این متغیر یک واحد افزایش پیدا می‌کند. از سوی دیگر برای حذف متغیر در Session می‌توان از تابع unset()

 استفاده کرد که در قطعه کد زیر نحوه استفاده از این تابع نشان داده شده است.

1<?php
2// start a session 
3session_start();
4 
5// initialize a session variable 
6$_SESSION['logged_in_user_id'] = '1';
7 
8// unset a session variable 
9unset($_SESSION['logged_in_user_id']);
10?>

در مثال بالا با فراخوانی تابع unset()

 دیگر امکان دسترسی به متغیر $_SESSION[‘logged_in_user_id’]

 وجود ندارد.

حذف Session در PHP‌

همان طور که در بخش قبل عنوان شد به منظور حذف متغیرهای Session می‌توان از تابع unset()

 استفاده کرد. از سوی دیگر برای حذف تمام داده‌های مربوط به یک Session در PHP می‌توان تابع session_destroy()

 را به کار گرفت.

برنامه نویس در حال کد نویسی و طراحی سایت و استفاده از مفهوم Session در PHP

تابع session_destroy()

 تمام اطلاعات ذخیره شده درون Session را به طور کامل حذف می‌کند. از سوی دیگر فراخوانی این تابع تاثیری در عملکرد سایر کوکی‌های تنظیم شده ندارد. با توجه به این مورد در زمان خروج کاربر از برنامه توصیه می‌شود تا تمام متغیرهای Session و کوکی‌ها مرتبط حذف شوند. قطعه کد زیر روشی استاندارد برای حذف متغیرهای Session و کوکی در PHP معرفی می‌کند.

1<?php
2// start a session 
3session_start();
4 
5// destroy everything in this session 
6 
7unset($_SESSION);
8if (ini_get("session.use_cookies")) {
9    $params = session_get_cookie_params();
10    setcookie(session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"],$params["httponly"]);
11}
12 
13session_destroy();
14?>

کاربرد Session Handler در PHP چیست؟

Session Handler مکانیزمی به منظور مدیریت Sessionها در PHP ارائه می‌دهد. به صورت پیش‌فرض مدیریت Session در PHP از طریق ذخیره اطلاعات بر روی فایل انجام می‌شود. این فایل کم حجم بر روی سرور قرار می‌گیرد که با شناسه منحصر به فرد Session مرتبط است. این شناسه همان شناسه‌ای است که از طریق کوکی بر روی مرورگر کاربر ذخیره می‌شود. با وجود این که این فایل تمام اطلاعات مورد نیاز برنامه نویس را در دسترس قرار می‌دهد ولی گاهی اوقات نیاز است تا اطلاعات مربوط به Session به گونه‌ای متفاوت ذخیره شوند.

برنامه‌نویس نشسته پشت لپ تاپش در حال طراحی سایت و مدیریت Session در PHP

به عنوان مثال، امکان ذخیره‌سازی اطلاعات بر روی پایگاه داده، Redis و سایر فضاهای ذخیره‌سازی دیگر وجود دارد. در این شرایط باید یک Session Handler سفارشی‌سازی شده را پیاده‌سازی کرد. در ادامه این بخش از نوشته نحوه پیاده‌سازی Session Handler به منظور مدیریت Sessionها از طریق پایگاه داده آموزش داده شده است.

نحوه پیاده‌سازی Session Handler با پایگاه داده

چرخه حیات Session در PHP شامل ۴ مرحله باز کردن، خواندن، نوشتن و بستن است. علاوه بر این، ۲ مرحله دیگر یعنی از بین بردن و جمع‌آوری زباله نیز وجود دارد. بنابراین، در زمان پیاده‌سازی Session Handler سفارشی باید این مراحل به ترتیب انجام شوند تا داده‌های مربوط به Session به درستی مدیریت شوند.

برای پیاده‌سازی Session Handler سفارشی ۲ روش وجود دارد. در روش اول می‌توان توابع callback برای هر کدام از مراحل چرخه حیات Session تعریف کرد و در روش دوم باید کلاسی برای پیاده‌سازی رابط SessionHandlerInterface نوشت. در این بخش نحوه پیاده‌سازی رابط SessionHandlerInterface توضیح داده شده است.

ساخت جدول session در پایگاه داده

برای ذخیره‌سازی داده‌های مربوط به session باید جدولی را در پایگاه داده MySQL ایجاد کرد. قطعه کد زیر جدول sessions را در پایگاه داده ایجاد می‌کند.

1CREATE TABLE `sessions` (
2  `session_id` varbinary(192) NOT NULL,
3  `created` int(11) NOT NULL DEFAULT '0',
4  `session_data` longtext COLLATE utf8mb4_unicode_ci,
5  PRIMARY KEY (`session_id`)
6) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

این جدول دارای ۳ ستون برای ذخیره‌سازی اطلاعات session مورد نظر با نام‌های session_id

 ، created

 و session_data

 است. برای ارتباط با این جدول نیز کلاسی باید پیاده‌سازی شود که قطعه کد زیر نحوه ایجاد این کلاس را نشان می‌دهد.

1<?php
2class MySQLSessionHandler implements SessionHandlerInterface
3{
4    private $connection;
5    public function __construct()
6    {
7        $this->connection = new mysqli("HOST_NAME","USERNAME","PASSWORD","DATABASENAME");
8    }
9    public function open($savePath, $sessionName)
10    {
11        if ($this->connection) {
12            return TRUE;
13        } else {
14            return FALSE;
15        }
16    }
17    public function read($sessionId)
18    {
19        try {
20            $stmt = $this->connection->prepare("SELECT session_data FROM sessions WHERE session_id = ?");
21            $stmt->bind_param("s", $sessionId);
22            $stmt->execute();
23            $stmt->bind_result($sessionData);
24            $stmt->fetch();
25            $stmt->close();
26            return $sessionData ? $sessionData : '';
27        } catch (Exception $e) {
28            return '';
29        }
30    }
31    public function write($sessionId, $sessionData)
32    {
33        try {
34            $stmt = $this->connection->prepare("REPLACE INTO sessions(`session_id`, `created`, `session_data`) VALUES(?, ?, ?)");
35            $stmt->bind_param("sis", $sessionId, $time=time(), $sessionData);
36            $stmt->execute();
37            $stmt->close();
38            return TRUE;
39        } catch (Exception $e) {
40            return FALSE;
41        }
42    }
43    public function destroy($sessionId)
44    {
45        try {
46            $stmt = $this->connection->prepare("DELETE FROM sessions WHERE session_id = ?");
47            $stmt->bind_param("s", $sessionId);
48            $stmt->execute();
49            $stmt->close();
50            return TRUE;
51        } catch (Exception $e) {
52            return FALSE;
53        }
54    }
55    public function gc($maxlifetime)
56    {
57        $past = time() - $maxlifetime;
58        try {
59            $stmt = $this->connection->prepare("DELETE FROM sessions WHERE `created` < ?");
60            $stmt->bind_param("i", $past);
61            $stmt->execute();
62            $stmt->close();
63            return TRUE;
64        } catch (Exception $e) {
65            return FALSE;
66        }
67    }
68    public function close()
69    {
70        return TRUE;
71    }
72}

در مثال بالا کلاس MySQLSessionHandler

 توسط رابط SessionHandlerInterface

 پیاده‌سازی شده است. بنابراین، متدهای تعریف شده در رابط SessionHandlerInterface

 باید توسط این کلاس پیاده‌سازی شود. در ادامه این بخش متدهای موجود در این رابط و نحوه کار هر کدام ارائه شده است.

متد construct

این متد امکان ارتباط با پایگاه داده MySQL را فراهم می‌کند. قطعه کد زیر این متد را نشان می‌دهد.

1    public function __construct()
2    {
3        $this->connection = new mysqli("HOST_NAME","USERNAME","PASSWORD","DATABASENAME");
4    }

نکته بسیار مهم در خصوص این متد توجه کردن به مقادیر HOST_NAME

 ، USERNAME

 و سایر پارامترهای دریافتی آن است که حتماً باید با دقت وارد شوند. در صورت بروز هر گونه خطا در عملکرد این متد امکان ارتباط با پایگاه داده وجود نخواهد داشت.

متد open

با راه‌اندازی و شروع شدن session این متد فراخوانی می‌شود. قطعه کد زیر این متد را نشان می‌دهد.

1    public function open($savePath, $sessionName)
2    {
3        if ($this->connection) {
4            return TRUE;
5        } else {
6            return FALSE;
7        }
8    }

این متد در صورت موفقیت آمیز بودن ارتباط با پایگاه داده مقدار TRUE

 را بر می‌گرداند و در صورت بروز هر گونه مشکل در ارتباط با پایگاه داده مقدار FALSE

 را برگشت می‌دهد.

متد read

بعد از راه‌اندازی session متد read

 به منظور خواندن اطلاعات session توسط PHP فراخوانی می‌شود. در ادامه نحوه پیاده‌سازی متد read

 آورده شده است.

1   public function read($sessionId)
2    {
3        try {
4            $stmt = $this->connection->prepare("SELECT session_data FROM sessions WHERE session_id = ?");
5            $stmt->bind_param("s", $sessionId);
6            $stmt->execute();
7            $stmt->bind_result($sessionData);
8            $stmt->fetch();
9            $stmt->close();
10            return $sessionData ? $sessionData : '';
11        } catch (Exception $e) {
12            return '';
13        }
14    }

این متد شناسه Session یا همان Session ID را به عنوان آرگومان ورودی دریافت می‌کند. در ادامه این متد چک خواهد کرد که آیا مقداری مرتبط با Session ID در جدول sessions

 وجود دارد یا خیر. در صورت وجود مقدار فیلد session_data

 از جدول برگشت داده می‌شود و در غیر این صورت رشته خالی برگشت داده خواهد شد.

متد write

در زمان بستن یا ذخیره کردن session متد write

 فراخوانی می‌شود. این متد برای نوشتن داده‌های مربوط به session در پایگاه داده مورد استفاده قرار می‌گیرد. قطعه کد زیر نحوه پیاده‌سازی متد write

 را نشان می‌دهد.

1    public function write($sessionId, $sessionData)
2    {
3        try {
4            $stmt = $this->connection->prepare("REPLACE INTO sessions(`session_id`, `created`, `session_data`) VALUES(?, ?, ?)");
5            $stmt->bind_param("sis", $sessionId, $time=time(), $sessionData);
6            $stmt->execute();
7            $stmt->close();
8            return TRUE;
9        } catch (Exception $e) {
10            return FALSE;
11        }
12    }

در مثال بالا برای اطمینان حاصل کردن از وجود یا عدم وجود ورودی از دستور REPLACE

 استفاده شده است. این دستور در صورت وجود مقدار فیلد مربوطه را بروزرسانی می‌کند و در صورت عدم وجود مقدار نیز آن را به عنوان فیلد جدید در جدول مورد نظر درج خواهد کرد.

متد close

متد close

 بعد از فراخوانی متد write

 توسط session فراخوانی می‌شود. این متد عملکردی مشابه تابع «مخرب» (Destructor) در کلاس دارد. قطعه کد زیر متد close را نشان می‌دهد.

1    public function close()
2    {
3        return TRUE;
4    }

در مثال بالا متد close

 کار خاصی انجام نمی‌دهد و فقط مقدار True را بر می‌گرداند.

متد destroy

متد destroy

 در زمان از بین رفتن session توسط تابع session_destroy

 فراخوانی می‌شود. قطعه کد زیر متد destroy

 را نشان می‌دهد.

1    public function destroy($sessionId)
2    {
3        try {
4            $stmt = $this->connection->prepare("DELETE FROM sessions WHERE session_id = ?");
5            $stmt->bind_param("s", $sessionId);
6            $stmt->execute();
7            $stmt->close();
8            return TRUE;
9        } catch (Exception $e) {
10            return FALSE;
11        }
12    }

با فراخوانی این متد اطلاعات مربوط به session از پایگاه داده و جدول مربوطه حذف خواهد شد.

متد gc

همان طور که پیش‌تر نیز عنوان شد تمام sessionهای تعریف شده دارای زمان انقضا هستند و بعد از مدتی منقضی می‌شوند. با توجه به همین مورد متدی به نام gc

 در این بخش پیاده‌سازی شده است که مسئولیت جمع‌آوری زباله را بر عهده دارد. در ادامه نحوه پیاده‌سازی این متد آورده شده است.

1    public function gc($maxlifetime)
2    {
3        $past = time() - $maxlifetime;
4        try {
5            $stmt = $this->connection->prepare("DELETE FROM sessions WHERE `created` < ?");
6            $stmt->bind_param("i", $past);
7            $stmt->execute();
8            $stmt->close();
9            return TRUE;
10        } catch (Exception $e) {
11            return FALSE;
12        }
13    }

متغیر $lifetime

 مقدار session.gc_maxlifetime

 در فایل پیکربندی PHP را در خود ذخیره می‌کند. با استفاده از این متد می‌توان تمام sessionهای منقضی شده را حذف کرد.

استفاده از کلاس MySQLSessionHandler

بعد از پیاده‌سازی کلاس MySQLSessionHandler

 و آشنایی با متدهای آن نحوه استفاده از آن در ادامه آورده شده است.

1$objSessionHandler = new MySQLSessionHandler();
2session_set_save_handler($objSessionHandler, true);
3session_start();
4$_SESSION['favoriteWebsite'] = 'tutsplus.com';

در مثال بالا یکی شی جدید از کلاس MySQLSessionHandler

 ایجاد و مقداردهی اولیه شده است. سپس این شی به تابع session_set_save_handler

 ارسال شده است که به PHP دستور می‌دهد که برای مدیریت session از کلاس MySQLSessionHandler

 استفاده کند. در ادامه نیز تابع session_start

 برای شروع session فراخوانی می‌شود. به عنوان آخرین گام نیز یک متغیر session مقداردهی شده است. در صورت موفقیت آمیز بودن تمام مراحل مقدار مربوط به session را در جدول sessions می‌توانید مشاهده کنید.

چگونه بدون کوکی می‌توان از Session استفاده کرد؟

احتمالاً هنگام بازدید از سایت‌های مختلف با کادری مواجه شده‌اید که درخواست استفاده و ذخیره کوکی‌ها را از شما دارد. کاربران به سادگی می‌توانند استفاده و ذخیره کوکی‌ها را در مرورگر خود محدود کنند. سوالی که در اینجا مطرح می‌شود این است که بدون امکان استفاده از کوکی‌ها اسکریپت PHP چگونه می‌تواند Session ID را پیدا کند. در این شرایط راه حل جایگزین موجود استفاده از Session ID ثابت است. قطعه کد زیر این مسئله را نشان می‌دهد.

1<?php
2
3   session_start();
4
5   if (isset($_SESSION['counter'])) {
6
7      $_SESSION['counter'] = 1;
8
9   }else {
10
11      $_SESSION['counter']++;
12
13   }
14
15   $my_Msg = "This page was visited ".  $_SESSION['counter'];
16
17   $my_Msg .= " time during this session.n";
18
19   echo ( $my_Msg );
20
21?>
22
23<p>
24
25   To continue click here <br />
26
27   <a  href = "newpage.php?<?php echo htmlspecialchars(SID); ?>">
28
29</p>

Session ID ثابت پیش از شروع شدن Session و در ابتدای کار تعریف می‌شود. در صورتی که کاربر اجازه استفاده از کوکی ها را بدهد، آنگاه مقدار آن برابر یک رشته خالی خواهد بود. همچنین، در صورت عدم اجازه استفاده از کوکی ها مقدار SID برابر نام Session خواهد بود. خروجی حاصل از اجرای قطعه کد بالا به صورت زیر است.

This page was visited 1 time during this session.
To continue click here

مفهوم session timeout چیست؟

یکی از نکات مهم در خصوص استفاده از Session در PHP توجه به محدودیت‌های زمانی نشست است. session timeout به مدت زمانی اشاره دارد که بعد از ایجاد Session کاربر امکان تعامل با وب‌سایت یا برنامه مورد نظر را دارد. بعد از ورود کاربر به وب‌سایت یا برنامه یک Session ایجاد می‌شود و در مدت فعال بودن این Session کاربر امکان تعامل با سیستم را خواهد داشت. در این بین session timeout مدت زمان فعال بودن نشست را مشخص می‌کند. پیش‌تر در مطلب زیر از مجله فرادرس شیوه استفاده از نشست‌ها در PHP در قالب مثال مورد بررسی قرار گرفته است.

هدف از تعیین session timeout چیست؟

اهداف امنیتی و مدیریت منابع مهم‌ترین دلایل استفاده از session timeout هستند. session timeout حساب‌های کاربری را از دسترسی غیرمجاز محافظت می‌کند، زیرا گاهی اوقات کاربران فراموش می‌کنند که از حساب کاربری خود خارج شوند. در نتیجه، با غیرفعال شدن Sessionها پس از مدت معینی عدم فعالیت خطر دسترسی غیرمجاز به اطلاعات کاربران کاهش می‌یابد. با پایان یافتن Session کاربران به طور خودکار از وب‌سایت خارج می‌شوند و نیاز است تا دوباره وارد حساب کاربری خود شوند.

مدت زمان session timeout چقدر است؟

امکان تعیین مدت زمان فعال بودن یک Session از طریق کد نویسی وجود دارد و این زمان به طور معمول از چند دقیقه تا چند ساعت متغیر است. زمان‌بندی Sessionها به منظور افزایش امنیت کاربر و برنامه صورت می‌گیرد. زمان‌بندی‌های طولانی راحتی کاربران را افزایش می‌دهد، زیرا کاربر نیاز به ورود چندین باره اطلاعات هویتی خود ندارد. از سوی دیگر اما زمان‌بندی کوتاه‌تر برای فعال بودن Sessionها امنیت برنامه را افزایش می‌دهد و البته مشکلاتی را برای کاربران ایجاد خواهد کرد. نکته مهم در خصوص مدت زمان انقضای session این است که اغلب سعی می‌شود تا اعلان‌های هشدار به کاربران در خصوص منقضی شدن جلسه داده شود.

برنامه نویس در حال طراحی سایت و ساعت عقریه ای نیز بر روی میزش قرار دارد

یادگیری طراحی سایت با فرادرس

طراحی سایت شامل مجموعه اقداماتی است که در نهایت به پیاده‌سازی وب‌سایت‌ها و وب‌اپلیکیشن‌های کاربردی ختم می‌شود. بدون اغراق طراحی سایت یکی از پیچیده‌ترین و در عین حال جذاب‌ترین حوزه‌های برنامه نویسی است. به منظور یادگیری طراحی سایت می‌توانید از فیلم‌های آموزشی فرادرس استفاده کنید. مجموعه فیلم‌های آموزش طراحی و برنامه نویسی سایت فرادرس شامل ویدیو‌های مختلفی است که به شما در یادگیری هر چه بهتر مهارت‌های طراحی سایت کمک می‌کند.

مجموعه فیلم های آموزشی طراحی و برنامه نویسی سایت فرادرس

برای یادگیری طراحی سایت نیاز است در گام نخست اصول اولیه طراحی صفحات وب را فرا بگیرید. با استفاده از فیلم‌های آموزشی که در ادامه آورده شده است می‌توانید فناوری‌های پایه طراحی سایت نظیر HTML ،CSS و جاوا اسکریپت را به خوبی یاد بگیرید.

بعد از یادگیری مفاهیم پایه طراحی وب می‌توانید به سراغ یادگیری سایر فناوری مورد استفاده در این حوزه بروید. برای این منظور می‌توانید از فیلم‌های آموزشی پروژه محور فرادرس که در ادامه آورده شده است استفاده کنید.

جمع‌بندی

درک مفهوم Session در PHP و توانایی استفاده از آن برای توسعه وب‌اپلیکیشن‌های پویا و تعاملی ضروری است. Sessionها سازوکاری را برای احراز هویت امن کاربران، ذخیره‌سازی کارآمد اطلاعات و سفارشی‌سازی خاص کاربر فراهم می‌کنند. در نتیجه، توسعه دهندگان با پیاده‌سازی مدیریت Session می‌توانند امنیت و قابلیت استفاده برنامه خود را بهبود بخشند. بر همین اساس در این مطلب از مجله فرادرس به این سوال پاسخ داده شد که Session در PHP چیست و چه کاربردهایی دارد. برای یادگیری مفاهیم بیشتر در حوزه برنامه نویسی PHP می‌توانید دوره‌های موجود در مجموعه فیلم‌های آموزشی PHP فرادرس که لینک آن در ادامه آورده شده است را مشاهده کنید.

در این مطلب سعی شد تا ابتدا چرایی استفاده از Session توضیح داده شود. سپس، به صورت گام‌به‌گام و به زبان ساده مراحل ساخت Session در PHP به طور کامل بیان شد. در ادامه نیز سعی شد تا به برخی از سوالات مهم در این حوزه پاسخ داده شود.

source

توسط expressjs.ir