کوکی ها (cookie) و session ها در PHP 7

08 مرداد 1398
درسنامه درس 19 از سری آموزش PHP 7
کوکی ها (cookie) و session ها در PHP 7

کوکی ها استفاده های متعددی دارند اما در سمت سرور معمولا از آن ها برای شناسایی یک کاربر استفاده می شود. کوکی ها از نظر فنی فایل های کوچکی هستند که سرور (یا جاوا اسکریپت) آن ها را در مرورگر کاربر ایجاد می کند. حالا هر بار که این کامپیوتر درخواست صفحه ای را با همان مرورگر (که حاوی کوکی است) بدهد کوکی نیز ارسال می شود. با استفاده از زبان PHP می توانیم هم کوکی ها را ایجاد کرده و هم آن ها را دریافت کنیم. برای ساخت یک کوکی در  PHP از تابع ()setcookie استفاده می کنیم که دارای ساختار کلی زیر است:

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

تنها پارامتر الزامی name است، تعیین دیگر پارامتر ها اختیاری است.

مثال زیر یک کوکی به نام user می سازد و مقدار آن را John Doe قرار داده ایم. این کوکی پس از 30 روز (86400 * 30) منقضی می شود (یعنی از بین می رود). علامت / نیز یعنی این کوکی در تمامی وب سایت در دسترس بوده و محدود به صفحه یا آدرس خاصی نیست (شما می توانید کوکی را به دیرکتوری خاصی محدود کنید).

در آخر مقدار کوکی (مقدار user) را از طریق متغیر سراسری COOKIE_$ دریافت می کنیم. همچنین قبل از دریافت باید از تابع ()isset استفاده کرد تا مطمئن شویم چنین کوکی وجود دارد یا خیر. به مثال زیر توجه کنید:

<!DOCTYPE html>
<?php
$cookie_name = "user";
$cookie_value = "John Doe";
setcookie($cookie_name, $cookie_value, time() + (86400 * 30), "/"); // 86400 = 1 day
?>
<html>
<body>

<?php
if(!isset($_COOKIE[$cookie_name])) {
     echo "Cookie named '" . $cookie_name . "' is not set!";
} else {
     echo "Cookie '" . $cookie_name . "' is set!<br>";
     echo "Value is: " . $_COOKIE[$cookie_name];
}
?>

<p><strong>Note:</strong> You might have to reload the page to see the value of the cookie.</p>

</body>
</html>

مشاهده ی خروجی

زمانی که برای اولین بار وارد صفحه ی خروجی این کد شوید کوکی ساخته می شود. سپس باید صفحه را refresh کنید (دوباره وارد صفحه شوید) تا کوکی ساخته شده دریافت شود.

مقدار کوکی هنگام ارسال به صورت خودکار URLencoded شده و در هنگام دریافت به صورت خودکار decode می شود. اگر می خواهید چنین اتفاقی نیوفتد باید از تابع ()setrawcookie استفاده کنید.

نکته ی مهم: تابع ()setcookie باید حتما قبل از تگ <html> بیاید.

حذف یا ویرایش کوکی در PHP

سوال: برای ویرایش یا حذف یک کوکی در PHP چه کار باید کرد؟

پاسخ: ویرایش کوکی ها بسیار آسان است؛ باید آن ها را با استفاده از ()setcookie دوباره بسازید! به مثال زیر دقت کنید:

<!DOCTYPE html>
<?php
$cookie_name = "user";
$cookie_value = "Alex Porter";
setcookie($cookie_name, $cookie_value, time() + (86400 * 30), "/");
?>
<html>
<body>

<?php
if(!isset($_COOKIE[$cookie_name])) {
     echo "Cookie named '" . $cookie_name . "' is not set!";
} else {
     echo "Cookie '" . $cookie_name . "' is set!<br>";
     echo "Value is: " . $_COOKIE[$cookie_name];
}
?>

<p><strong>Note:</strong> You might have to reload the page to see the new value of the cookie.</p>

</body>
</html>

مشاهده ی خروجی

برای حذف کوکی ها نیز از همان تابع ()setcookie استفاده کنید و تاریخ انقضای آن را روی زمان گذشته تنظیم کنید (مثلا دیروز یا پارسال یا ...). به مثال زیر دقت کنید:

<!DOCTYPE html>
<?php
// set the expiration date to one hour ago
setcookie("user", "", time() - 3600);
?>
<html>
<body>

<?php
echo "Cookie 'user' is deleted.";
?>

</body>
</html>

مشاهده ی خروجی

برخی اوقات کاربران کوکی های خود را غیرفعال می کنند. اگر دوست دارید تا قبل از هر کار چک کنید تا مطمئن شوید کوکی های کاربر فعال است یا خیر می توانید ابتدا یک کوکی بی مقدار را برای تست بسازید. سپس تعداد کوکی ها را از COOKIE_$ بشمارید:

<!DOCTYPE html>
<?php
setcookie("test_cookie", "test", time() + 3600, '/');
?>
<html>
<body>

<?php
if(count($_COOKIE) > 0) {
    echo "Cookies are enabled.";
} else {
    echo "Cookies are disabled.";
}
?>

</body>
</html>

مشاهده ی خروجی

نشست (session) چیست؟

session ها راهی برای ذخیره ی اطلاعات در متغیرها هستند که در چندین صفحه ی مختلف استفاده شود. زمانی که با یک برنامه ی وب طرف هستید آن را باز می کنید، کارهایی را انجام داده و در آخر آن را میبندید. همین عملیات بسیار شبیه session ها است! در واقع کامپیوتر می داند که شما چه کسی هستید، چه زمانی برنامه را باز کرده و چه زمانی آن را بسته اید اما در بستر اینترنت مشکلی وجود دارد: سرور نمی داند شما چه کسی هستید چرا که HTTP نمی تواند وضعیت را همیشه فعال نگه دارد؛ شما هنگام خاموش کردن مودم از اینترنت جدا می شوید!

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

session ها با استفاده از تابع ()session_start در PHP شروع شده و در SESSION_$ ذخیره می شوند. برای کار با session ها صفحه ی جدیدی به نام demo_session1.php می سازیم تا در آن چند session ایجاد کنیم:

<?php
// Start the session
session_start();
?>
<!DOCTYPE html>
<html>
<body>

<?php
// Set session variables
$_SESSION["favcolor"] = "green";
$_SESSION["favanimal"] = "cat";
echo "Session variables are set.";
?>

</body>
</html>

مشاهده ی خروجی

تابع ()session_start باید اولین چیز در سند شما باشد، قبل از هر تگ HTML دیگری!

حالا یک صفحه ی دیگر به نام demo_session2.php می سازیم تا به Session ها دسترسی داشته باشیم. حتما شما هم متوجه شده اید که Session ها به طور جداگانه و تک تک به صفحات ارسال نمی شوند بلکه از همان نشست اولیه (()session_start) دریافت می شوند. همچنین باید بدانید که تمام session ها در متغیر سراسری SESSION_$ ذخیره می شوند.

<?php
session_start();
?>
<!DOCTYPE html>
<html>
<body>

<?php
// Echo session variables that were set on previous page
echo "Favorite color is " . $_SESSION["favcolor"] . ".<br>";
echo "Favorite animal is " . $_SESSION["favanimal"] . ".";
?>

</body>
</html>

مشاهده ی خروجی

یک راه دیگر برای نمایش session ها به کاربر استفاده از کد زیر است:

<?php
session_start();
?>
<!DOCTYPE html>
<html>
<body>

<?php
print_r($_SESSION);
?>

</body>
</html>

مشاهده ی خروجی

نحوه ی کار session ها بدین شکل است که یک کلید خصوصی در کامپیوتر کاربر ایجاد می کنند که شبیه این کلید است: 765487cf34ert8dede5a562e4f3a7e12. سپس زمانی که یک Session در صفحه ی دیگری باز می شود به دنبال این کلید میگردد. اگر چیزی پیدا کرد به آن session دسترسی پیدا می کند و در غیر این صورت یک session جدید می سازد.

ویرایش یا حذف session ها

مانند کوکی ها برای ویرایش یک Session باید آن را overwrite کنید:

<?php
session_start();
?>
<!DOCTYPE html>
<html>
<body>

<?php
// to change a session variable, just overwrite it 
$_SESSION["favcolor"] = "yellow";
print_r($_SESSION);
?>

</body>
</html>

مشاهده ی خروجی

برای حذف session ها نیز می توانید از تابع ()session_unset یا ()session_destroy استفاده کنید:

<?php
session_start();
?>
<!DOCTYPE html>
<html>
<body>

<?php
// remove all session variables
session_unset(); 

// destroy the session 
session_destroy();

echo "All session variables are now removed, and the session is destroyed." 
?>

</body>
</html>

مشاهده ی خروجی

امیدوارم از این قسمت لذت برده باشید.

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

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

علی
02 تیر 1399
آیا میشه کوکی سایر وبسایت ها رو دریافت کرد ؟ کدش چیه ؟

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

بهداد
10 مرداد 1398
سلام ممنونم از مقاله ی خوبتون من چند تا سوال داشتم: 1- آیا session ها با بستن کل مرورگر از بین میرن یا با بستن تب ها هم نابود میشن؟ 2- session توی فارسی ترجمه شده؟ چی میشه؟ 3- کوکی ها رو میشه برای تم دادن و شخصی سازی هم استفاده کرد؟

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

امیر زوارمی
13 مرداد 1398
سلام دوست عزیز session ها با بستن کل مرورگر بسته میشن (البته راه هایی هست که session ها رو سمت سرور ذخیره هم کرد که وارد مباحث دیگه ای میشه) توی فارسی معمولا session رو به معنی «نشست» در نظر میگیرن. بهتره از همون Session استفاده کنید. برای کوکی ها هم بله میشه برای تم دادن به سایت استفاده کرد. مثلا مقدار خاصی رو برای هر تم در نظر بگیرین و بگین اگه فلان مقدار رو در کوکی کاربر داشتیم فلان تم نمایش داده بشه.

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