کوکی (Cookie) و سشن (Session) در PHP

آموزش Cookie و Session در PHP

همان گونه که در جلسه قبل به شما قول داده بود، در این جلسه قرار است مبحث بسیار مهم آرایه فوق سراسری سشن (session) و کوکی (cookie) را به طور کامل شرح می دهم. در ابتدا cookie را معرفی می کنم، چون تا زمانی که درک درستی از cookie نداشته باشید، session را درک نمی کنید.

cookie چیست؟

cookie اغلب برای شناسایی کاربر استفاده می شود. cookie یک فایل کوچک است که سرور بر روی کامپیوتر کاربر جاسازی می کند، هر بار که یک کامپیوتر یک صفحه را با یک مرورگر درخواست می کند، کوکی را نیز ارسال می کند. معمولا از cookie ها برای کاربردهایی همچون شناسه کاربری، رمز عبور، تنظیمات یک کاربر بر روی سایت و ... استفاده می شود

با php می توان یک cookie را ایجاد و بازیابی کرد. وقتی که یک کاربر از یک سایت برای چندمین بار بازدید می کند، مرورگر، اطلاعات موجود در cookie را به سرور می فرستد.

به عنوان مثال در نظر بگیرید که در یک تالار گفتگو (فروم) عضو شده اید و یک password و username را برای خودتان مشخص کرده اید. وقتیکه برای بار اول اطلاعات کاربری خود را در مرورگر وارد می کنید، این اطلاعات، درون یک cookie بر روی مرورگر کامپیوتر شما ذخیره می شود. و اگر باز به همان سایت بروید، خواهید دید که مرورگر، اطلاعات کاربری شما را خودش وارد کرده و شما login شده اید، بدون اینکه خودتان کاری انجام داده باشید.

دانستن اینکه cookieها در کجا ذخیره می شوند، با توجه به هر مرورگر فرق دارد. به عنوان مثال در تصویر زیر مکان ذخیره شدن cookie ها در مرورگر firefox برای شما آورده شده است.

cookie ها در فایر فاکس

کوکی ها در مرورگر firefox

نمایش نام و سایر ویژگی های cookie ها

حقیقت این است که مرورگر firefox از cookieها برای ایجاد، ذخیره و ارسال مجدد اطلاعات به سرور استفاده کرده است.

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

چگونه یک cookie با زبان برنامه نویسی php بسازیم؟

برای ساختن و ذخیره یک cookie از تابع setcookie() در زبان برنامه نویسی php استفاده می شود. نحوی تعریف cookie و پارامترهایی که تابع setcookie() مورد استفاده قرار می دهد، به شرح زیر می باشد:

setcookie(name, value, expire, path, domain, secure, httponly);

در کد بالا فقط پارامتر name اجباری است و سایر پارامتر ها اختیاری هستند.

نکته: به پارامتر expire دقت کنید، این پارامتر مشخص می کند که cookie تا چه زمانی اعتبار دارد، و بعد از تمام شدن زمان تعیین شده، cookie اعتبار خود را از دست می دهند.

برای اینکه بهتر با عملکرد cookie ها آشنا شوید به مثال زیر دقت کنید.

ابتدا تمام cookie های مرورگر (در اینجا firefox) را پاک می کنیم:

حذف کردن cookie ها

سپس یک فایل با نام Cookie.php در مسیر C:\wamp\www ایجاد کنید:

ساختن فایل cookie

حال با استفاده از Notepad++ ، فایل بالا را باز کرده و کدهای زیر را در داخل آن بنویسید و ذخیره نمایید:

<?php
     setcookie('Username','JahangirPachkam');
?>

سپس firefox را باز کنید و به آدرس http://localhost/Cookie.php بروید. به تصویر زیر دقت کنید و ببینید که cookie ما درست شده است:

یک مثال از cookie

با توجه به شکل بالا، یک کوکی با نام Username و مقدار JahangirPachkam ایجاد شده است، ولی با توجه به اینکه ما برای این کوکی طول عمر تعریف نکرده ایم (Expire)، این کوکی پعد از بسته شدن مرورگر پاک می شود. برای جلوگیری از این کار یک زمان انقضا به صورت دستی برای آن تعریف می کنیم:

<?php
     setcookie('Username','JahangirPachkam',time()+60);
?>

طول عمر cookie

در کد بالا با استفاده از تابع time() که تاریخ فعلی سرور را مشخص می کند و عدد 60 (ثانیه) ، مشخص کرده ایم که اطلاعات کاربر از لحاظ ورودی تا 1 دقیقه بعد در کوکی ذخیره و بعد از آن حذف می شود.

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

آرایه سراسری $_COOKIE برای به دست آوردن مقدار کوکی به کار می رود.

کد بالا را به صورت زیر تغییر دهید و آنرا در مرورگر اجرا کنید:

<?php
setcookie('Username','JahangirPachkam',time()+60);

echo $_COOKIE["Username"];
?>

نتیجه echo کردن آریه فوق سراسری $_COOKIE

همانطور که در شکل بالا مشاهده می کنید برای به دست آوردن مقدار یک کوکی کافیست نام آن را (در این مثال Username) به آرایه سراسری $_COOKIE بدهیم.

در نتیجه مقدار آن که در این مثال jahangir است در مرورگر چاپ می شود. البته مقدار JahangirPachkam تا زمانی قابل شناسایی توسط سرور است که کوکی منقضی نشده باشد که در این مثال تا قبل از یک دقیقه است.

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

پیامی که بعد از منقضی شدن cookie به نمایش در می آید.

Session چیست؟

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

نمونه بارز استفاده از Session ها را می توان به هنگام وارد شدن به یک سایت (لاگین شدن) مشاهده کرد. به طوریکه وقتی وارد یک سایت می شوید و صفحات مختلف آن را مرور می کنید نام کاربری شما در کل صفحات در دسترس و قابل مشاهده است. فرایند ذخیره سازی داده ها و استفاده از آنها در Session به صورت زیر است:

۱) کاربر از طریق مرورگر یک درخواست می فرستد.

۲) با فرض اینکه این درخواست ارسال نام کاربری و کلمه عبور برای ورود به سایت باشد، یک فایل تصادفی و منحصر به فرد با پسوند _sess در سرور و در پوشه tmp ایجاد می شود.

۳) با ایجاد فایل در پوشه tmp ، سرور یک کوکی در داخل مرورگر ایجاد و رشته 32 رقمی و یکتا را داخل آن قرار می دهد و این رشته 32 رقمی را SID یا Session ID می نامند و نامی که برای آن در کوکی اختصاص داده می شود، PHPSESSID (به صورت پیش فرض) می باشد:

$_COOKIE['PHPSESSID'];

۴) برای خواندن اطلاعات از فایلی که در سرور ایجاد شده است (فایل با پسوند _sess) مرورگر با هر بار درخواست ، این ID را به سرور ارسال کرده و سرور هم فایل مخصوص آن را از داخل پوشه tmp پیدا و مقادیر داخل آن را می خواند.

تنظیمات پیش فرض Session در فایل php.ini به صورت زیر است:

نحوی پیدا کردن فایل phph

برای تغییر این تنظیمات ابتدا فایل php.ini را باز و سپس به گزینه هایی که در تصاویر زیر آورده شده دقت کنید:

files به معنای استفاده از فایل ها برای ذخیره Session است

مسیر ذخیره فایل های session در سرور

مقدار پیش فرض 1 به معنای این است که از کوکی ها برای ذخیره SID استفاده شود

استفاده از این گزینه به معنای این است که فقط از کوکی ها برای اگر مقدار پیش فرض آن را به 0 تغییر دهید، SID از طریق کوکی ارسال نمی شود

توضیح در مورد تنظیمات session در فایل php.ini

نام پيش فرض که به کوکي سشن اختصاص داده شده است

اگر مقدار پيش فرض آن را به 1 تغيير دهيد با شروع اسکريپت، سشن هم شروع به کار مي کند ، يعني تابع session_start فراخواني مي شود

زمان اعتبار کوکي مربوط به سشن را مشخص مي کند.

اجازه بدهید که نحوی ایجاد و استفاده از session را توضیح دهیم.

ایجاد Session در PHP

ایجاد session بسیار ساده است و با استفاده از متد session_start() انجام می شود.

وقتی که این متد فراخوانی می شود، یک فایل session در سرور و کوکی معادل آن که دارای رشته 32 رقمی SID است در مرورگر کاربر ایجاد می شود.

اگر این کوکی از قبل وجود داشته و توسط مرورگر ارسال شده باشد، متد session_start() از این داده ها استفاده می کند و کوکی جدیدی ایجاد نمی کند. برای فراخوانی این متد حتما باید در اولین خط اسکریپت خود بنویسیم:

<?php
// Start the session
session_start();
?>

همانطور که اشاره شد، برای اعتبار سنجی کاربر و ارسال SID به سرور، سشن هم از کوکی استفاده می کند.

حال اگر کاربر کوکی های مرورگر را غیر فعال نمایید، SESSION این کار را چگونه انجام می دهد؟ اگر یک لینک به صفحه مورد نظر داشته باشید، PHPSESSID را به صورت زیر اضافه می کند:

<a href="page.php?PHPSESSID=b8306b025a76a250f0428fc0efd20a11">Other Page</a>

اگر از طریق همین لینک مقادیر دیگری هم ارسال شود، PHPSESSID به صورت زیر اعمال می شود:

<a href="page.php?id=1&PHPSESSID=b8306b025a76a250f0428fc0efd20a11">Other Page</a>

و اگر اطلاعات قرار است از طریق فرم ارسال شوند، PHPSESSID از طریق یک تگ input با خاصیت hidden ارسال می شود:

<form action=" "  method=" ">
	<input type="hidden" name="PHPSESSID" value="b8306b025a76a250f0428fc0efd20a11" />
</form>

خواندن و نوشتن داده های session

کار با داده های session بسیار راحت است. برای اینکار داده ها را به صورت کلید/مقدار در آرایه فوق سراسری $_SESSION ذخیره می کنید. در session بر خلاف cookie که از تابع setCookie() برای ذخیره داده ها استفاده می کردید، چنین تابعی وجود ندارد و شما مستقیما می توانید یک نام دلخواه به عنوان کلید برای داده های که می خواهید ذخیره کنید، انتخاب نمایید.

مثلا در زیر نام یک شخص را در یک session ذخیره کردیم:

$_SESSION["firstName"] = "jahangir";
  $_SESSION["LastName"]="pachkam";

در کد بالا، کلیدها به ترتیب firstName و LastName می باشد و مقدارهای متناظر هر کلید هم به ترتیب jahangir و pachkam می باشد. برای خواندن این سشن هم مانند آرایه ها کافی است که از دستور echo برای چاپ این مقدار استفاده کنیم:

echo ($_SESSION["firstName"]  $_SESSION["LastName"]);

با اجرای دستور بالا مقدار jahangir pachkam چاپ می شود.

پاک کردن session در PHP

سشن برخلاف کوکی دارای طول عمر نیست، یعنی با بسته شدن مرورگر اطلاعات سشن هم پاک می شوند. گاهی اوقات لازم است که شما فورا سشن را پاک کنید. مثلا وقتی که کاربر از طریق سایت شما یک خرید انجام داده است و بدون اینکه مرورگر ببندد می خواهد دوباره یک خرید دیگر انجام دهد و شما می خواهید اطلاعات خرید قبلی را پاک کنید. برای پاک کردن سشن از تابع زیر استفاده می شود:

 <?php session_destroy();?>

کد بالا تمام اطلاعات موجود در session را حذف می کند، ولی اگر بخواهیم فقط اطلاعات یک session خاص ، مثلا firstName را پاک کنید، می توانید از تابع unset() استفاده نمایید:

unset ($_SESSION["firstName"]);

در پایان انتظار دارم که مباحث بالا را با تکرار و دیدن مثالهای متنوع تر به طور کامل ملکه ذهن خودتان کنید، چرا که در قسمتهای آینده با sessionها خیلی کار داریم.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری فروشگاه اینترنتی با PHP توصیه می‌کند:
نویسنده شوید
دیدگاه‌های شما (8 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

امیر
24 دی 1399
بعضی عکسها حذف شدن توی این نوشته و نمایش داده نمیشن؟

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

روکسو
07 بهمن 1399
با سلام. این مشکل برطرف شده است.

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

reza
24 فروردین 1399
سلام خسته نباشید اگه میشه همه ی کدهای این پروژه رو هم قرار بدین که به مشکل بر میخوریم از روی اون نگاه کنیم با تشکر از زحمات شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

جهانگیر پچکم
05 اردیبهشت 1399
سلام رضا جان من تمام سعی خودم رو انجام دادم تا فایل نهایی رو با حداقل قیمت برای شما عزیزان قرار بدم. در حال حاضر هم قیمت حداقلی ( 20 هزار تومان) با توجه به امکاناتی که داره در اختیار شما هست. لطفا به آدرس زیر مراجعه کنید تا بهتر متوجه امکانات این قالب و همچنین پیش نمایشی از اون رو ببینید. https://www.roxo.ir/home/programming/php-online-shop-script و همه کدهای این قالب رو می تونید در اختیار داشته باشید. انشاالله موفق باشید.

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

کیوان
26 بهمن 1398
درود و احترام خدمت شما جناب پچکم عزیز و تیم محترم روکسو خواستم بپرسم در بعضی سایت ها مثلا سیستم لایکشون برای کاربرهای مهمان فعال هست و بدون عضویت شما میتونین لایک کنید اما هر پست رو فقط یک بار میتونید لایک کنید چون کوکی یا سشن تنظیم کردند حالا اگر ما کوکی رو حذف کنیم دوباره میتونیم همون پست رو چندین بار با حذف کوکی لایک کنیم خواستم بدونم دقیقا از چه روشی استفاده میشود آیا کوکی ما در دیتابسشون ذخیره شده و هنگام لایک کردن کوکی کاربر رو از دیتابیس چک میکنند؟ یا کاری به دیتابس ندارند؟ دقیقا متوجه کارشون نمیشم با تشکر فراوان

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

جهانگیر پچکم
01 اسفند 1398
سلام به شما دوست عزیز، شناسایی کاربر از طریق کوکی صورت می گیرد، این گونه سایتها بار اولی که کاربر عمل لایک کردن را انجام می دهند، معمولا ip کاربر را در یک دیتابیس ذخیره می کنند و از طرف دیگر به صورت هم زمان همان ip را به اندازه زمانی مد نظر خودشان(مثلا 3 ماه) در یک کوکی ذخیره می کنند. وقتی شما بار دوم می خواهید لایک کنید، کوکی که در مرورگر شما ذخیره شده است را با مقدار دیتابیس مقایسه می کنند، دقت کنید در اینجا قطعا جواب true است ( یعنی ip های ذخیره شده در کوکی و دیتابیس یکسان هست) و لایک را قبول نمی کند. اما اگر شما کوکی را پاک کنید، عملا باعث می شوید مقدار کوکی جدید (که متناسب با ip جدید شما است) با ip ذخیره شده در دیتابیس (که از ورود قبلی شما به وب سایت هست) متفاوت باشد، و در نتیجه می توانید از دوباره عمل لایک کردن را انجام دهید. نکته: دقت کنید شما هر بار که اینترنت خود را خاموش و روشن می کنید یک ip جدید می گیرید. موفق باشید، جهانگیر پچکم

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

مریم
08 تیر 1398
با سلام خدمت شما ممنون از سایت بسیار خوبتون در قسمت 20 (آموزش سشن و کوکی) دستورات سشن باید کجا نوشته شود؟ سشن باید کجا ایجاد شود؟

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

جهانگیر پچکم
30 تیر 1398
با سلام به شما آموزش واضح بیان شده و اگر امکانش هست دقیقتر بفرمایید که کجای این مسئله و متوجه نمی شوید تا خدمت شما اونو توضیح بدم. مرسی

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

ایلیا
05 خرداد 1398
بعضی عکسها حذف شدن توی این نوشته و نمایش داده نمیشن؟

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

sama
13 فروردین 1398
سلام عالی بود، واقعا ممنون

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

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

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

امیرحسین
28 اسفند 1397
ایول دست خوش.خیلی خوب وکامل.

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

جهانگیر پچکم
03 فروردین 1398
سلام امیر حسین جان ممنونم که حمایت می کنید. انشاالله با تلاش بیشتری که شما انجام خواهید داد، کدها حتی تکمیل تر از این نیز خواهد شد. ممنونم

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

علی
03 اسفند 1397
با سلام سپاس از سایت عالیتون دستتون درد نکنه یه سوال داشتم توی هاست اشتراکی برای افزایش طول عمر سشن مقادیر زیر رو توی فایل htaccess اضافه کردم. #Session timeout php_value session.cookie_lifetime "90800" php_value session.gc_maxlifetime 90800 اما این تغییرات انگار اعمال نمیشه همین تنظیمات توی لوکال هاست جواب میده. ظاهرا باید آدرس ذخیره شدن سشن ها رو هم تغییر بدیم پیشنهاد شما چیه ؟

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

جهانگیر پچکم
05 اسفند 1397
با سلام به شما دوست عزیز و ممنون از اظهار لطف و محبت شما اول از همه به شما توصیه می کنم که این سوالات را در روکسو کیو (به آدرس https://www.roxo.ir/q/) مطرح کنید که علاوه بر نظر من، سایر نظرات و راه حل ها نیز در اختیار شما دوست گرامی قرار بگیرید. اما جواب سوال شما، با جستجو در مستندات و راه حل های ارائه شده برای مشکل شما، دریافتم که استفاده از session.gc_maxlifetime و session.cookie_lifetime مشکلات ساختاری دارند برای اینکه بهتر در مورد این مشکلات ساختاری اطلاعاتی به دست آورید و همچنین برای ارائه به دست آوردن یک راه حل مناسب شما را به دیدن صفحه اینترنتی زیر دعوت می کنم. https://stackoverflow.com/questions/520237/how-do-i-expire-a-php-session-after-30-minutes انشاالله که مشکل شما حل شود، اما اگر این مشکل حل نشد، در روکسو کیو (به آدرس https://www.roxo.ir/q/) عنوان بفرمایید، تا علاوه بر نظر بالا سایر نظرات را نیز مشاهده بفرمایید. ظمنا به شما و سایر دوستان قالب نهایی پروژه فروشگاهی را پیشنهاد می کنم، شما می توانید به آدرس https://www.roxo.ir/home/programming/php-online-shop-script مراجعه نمایید و فایل نهایی پروژه فروشگاهی را تهیه کنید، حتما قسمت پیش نمایش را مشاهده بفرمایید. با تشکر از شما، جهانگیر پچکم

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.