درس هشتم- سشن (Session) و سرایند اچتیتیپی HTTP Header
مقدمه
در
درس قبل به فن استفاده از کوکی پرداختیم و یاد گرفتیم که چطور از کوکیها
برای ردیابی و شناسایی کاربران در تارنمایمان بهره بریم٬ اینکه چطور
دادههای مربوط به مشخصات کاربر را در همه برگهها در دسترس داشته باشیم و
با توجه به آن دادهها سرویس مشخصی را ارایه کنیم. در این درس در دنباله
بحث ردیابی کاربران به معرفی تکنیک دیگری در این زمینه با نام «سشن» می
پردازیم.
سشن
سشن نوع دیگری از ابزار در بکار گرفتن دادههای کاربر در همه برگهها (در
کل تارنما) به منظور ردیابی آنها است. سشنها دادهها را در سرور ذخیره
میکنند و بعد یک شناساینده سشن٬ به شکل کوکی در رایانه کاربر ثبت میکنند.
این کوکی که به نام شناساینده «سشن» مربوطه در رایانه کاربر ذخیره میشود٬
در اصل راهنمای یافتن محل سشن در سرور میشود. بعد از ثبت دادهها٬
میتوان از آنها بصورت متغییرهای سشن بهره برد٬ که این متغییرها را تمام
برگهها قابل دسترسی هستند.
سشن یا کوکی
همانطور که در درس قبل گفتیم کوکیها دادههای مربوط به کاربر را در خود
رایانه کاربر ثبت میکنند و در زمان نیاز به آنها مراجعه میکنند٬ در صورتی
که سشنها این دادهها را در سرور سرویس دهنده ثبت میکنند٬ و یک کوکی هم
به عنوان مکان یاب در رایانه کاربر. اما دلایل استفاده از سشنها را
میتوان در سه بخش به شرح زیر آورد:
۱. امنیت سشنها به دلیل ثبت آنها در سرور بالاتر است٬ زیرا سشنها در مسیر کاربر و سرور در حال تردد نیستند و این احتمال دزدیده شدن آنها را کمتر میکند.
۲. سشنها توانایی حمل دادههای بیشتری را دارند.
۳. از آنجا که بعضی از کاربران ثبت کوکیها در رایانههایشان را مسدود میکنند٬ سشنها بدون مشکل در این شرایط کار میکنند.
نکته: سشنها بدون استفاده از کوکی راهنما هم قابل استفاده هستند.
استفاده از سشن با تابع session_start()
یک نکته ابتدایی و بسیار مهم در استفاده کردن از سشنها٬ قرار دادن تابعsession_start() در
ابتداییترین (بالاترین) محل برگهای است که میخواهد از سشن استفاده
کنید. این تابع پیاچپی میگوید که از سشن از قبل درست شده استفاده کند و
یا اینکه یک سشن تازه بسازد. فراموش نکنید که این تابع بخاطر خواندن کوکی
راهنما باید قبل از هر چیز دیگر فراخوانی شود٬ یعنی قبل از این تابع هیچ
دادهای به مرورگر فرستاده نشود. منظور از فرستاده نشدن داده به مرورگر در
اصل دادهای است که برای مرورگر فرستاده میشود تا چاپ و یا ... شود. پس
محل این تابع باید قبل از سرایند فایل اچتیامال شما باشد.
وقتی این تابع برای نخستین بار اجرا میشود٬ یک کوکی با نام پیش فرض PHPSESSID میفرستد. بعد از اینکه سشن آغاز شد میتوان مقادیر را به متغییرهای آنها سپرد البته به روش زیر:
$_SESSION ['key'] = value;
$_SESSION ['name'] = 'پیمان';
$_SESSION ['id'] = 3;
در اینجا برای بکاربردن و روشنتر کردن این بحث٬ به سراغ تارنمای از پیش ساخته خود رفته و به جای کوکیها از سشنها استفاده میکنیم٬ یعنی جای کوکیها را با سشنها تعویض میکنیم.
https://www.darsnameh.com/images/phpin/07/1.png
تغییرات در برگه ورود login.php
این برگه را باز کرده و در قسمتی که کوکیها را نوشته بودیم جای:
// تنظیم کوکیها
setcookie ('user_id', $row['id'], time()+3600);
setcookie ('first_name', $row['first_name'], time()+3600);
را با:
// تنظیم سشن
session_start();
$_SESSION['user_id'] = $row['id'];
$_SESSION['first_name'] = $row['first_name'];
تغییر دهید. همانطور که میبینید ابتدا از تابع session_start() استفاده کردهایم. دو مقدار شماره کاربر و نام او را در دو متغییر سشن با همین نامها قرار میدهیم تا در کل تارنما از این دو سشن استفاده کنیم.
برگه سرایند heard.html
در برگه سرایند هم جای کوکیها را با سشنها عوض میکنیم٬ یعنی جای:
if ( isset ( $_COOKIE['first_name'] ) ) echo ' درود ' . $_COOKIE['first_name'] ;
if ( !isset ($_COOKIE['first_name'] ) )
isset($_COOKIE['user_id'])
را با:
if ( isset ($_SESSION['first_name'] ) ) echo ' درود ' . $_SESSION['first_name'];
if ( !isset ($_SESSION['first_name'] ) )
if ( isset($_SESSION['user_id'] )(
عوض میکنیم.
برگه خروج logout.php
این برگه برای از بین بردن سشنها لازم است٬ از آنجا که در درس قبلی از
این برگه استفاده کردیم و کوکیها را در آن نابود کردیم٬ به سراغ این برگه
رفته و جای کوکیها را با سشنها عوض میکنیم٬ به روش زیر:
به جای
setcookie ('user_id', ' ' , time() - 3600 );
setcookie ('first_name' , ' ', time() - 3600 );
مقادیر زیر را میگذاریم.
echo 'به امید دیدار ' . $_SESSION['first_name'] ;
$_SESSION = array();
session_destroy();
setcookie ('PHPSESSID', '', time()-3600);
در این سه خط٬ ابتدا در خط ابتدایی با قرار دادن یک آرایه خالی در سشن٬ متغیرهای سشن را خالی کرده و بعد آن را با تابع session_destroy() نابود میکنیم٬ در آخر سر هم٬ راهنمای سشن که یک کوکی است با نام پیش فرض PHPSESSID را هم از بین میبریم.
سرایند اچ تی تی پی- HTTP Header()
این تابع که در بخش کوکی و سشن از آن استفاده کردیم٬ چیست؟
همانطور که میدانید پروتکل اچتیتیپی در اصل تکنولوژی بستر اینترنت
است٬ که راه و شیوه ارتباط بین کاربر (مرورگر) و سرور سرویس دهنده را تعیین
میکند. در زمان دیدن یک تارنما٬ وقتی یک مرورگر درخواست دیدن صفحهای را
از سرور میکند٬ آن مرورگر در برگشت٬ در اصل مجموعهای از دادهها را در
قالب سرایند اچتیتیپی دریافت میکند. این اتفاق از نظر و دید کاربران
مخفی است و آنها هرگر متوجه این نقل و انتقالها نمیشوند.
تابع سرایندheader() تابعی در پیاچپی است که از پروتکل اچتیتیپی استفاده میکند. حال این استفاده میتواند مانند شیوهای که از آن در درس کوکی و سشن بکار بردیم٬ یعنی هدایت به برگههای دیگر باشد:
Header ( " Location: http://localhost /index.php " ) ;
البته استفادههای دیگری هم میتوان از این تابع و بهرهوری آن از پروتکل اچتیتیپی کرد٬ مثلا فرستادن یک فایل به مرورگر یا ساختن کوکیها و یا غیره.
حالت کلی این تابع به شکل:
Header (header string );
این تابع دارای رشتههای فراوانی برای کارهای مختلف است٬ منظور از رشته همانstring و سرایندیست که در داخل تابع میآید تا عملکرد تابع را تعیین کند. بطور مثال برای فرستادن یک عکس به مرورگر میتوان به شکل زیر عمل کرد:
Header ("Content-Type: application / pdf ");
عبارت Content-Type در اینجا یک شناساینده نوع داده به مرورگر است٬ یعنی به مرورگر نوع داده فرستاده شده را خبر میدهد. در مثال بالا این تابع خبر از فرستاده شدن یک فایل پیدیاف pdf میدهد.
این شناسایندهها حتی شیوه رفتار با داده را هم میتوانند تعیین کنند٬ مثلا شناساینده: Content-Disposition٬ به مرورگر میگوید که چطور با داده برخورد کند:
header ( "Content-Disposition : attachment; filename= " file.pdf " ");
مقدار :attachment در مثال بالا به مرورگر میگوید که فایلی با نام file.pdfرا دریافت (دانلود) کند. عبارت filename در اینجا نقش یک میانجی برای نمایش فایل با نام را بازی میکند.
شناساینده دیگری با نام content-Length برای مشخص کردن مقدار داده برای فرستادن و دریافت آن است. مثلا سرایند:
header ("Content-Length: 2048 ");
یک فایل را با مقدار ۲ مگا را معرفی میکند.
در درس قبلی با نوع دیگری از سرایند به شکل ایجاد یک وقفه هم آشنا شدیم
$url = ‘index.php’;
Header (“Refresh: 2; URL= $url");
اینها نمونههایی از موارد استفاده از تابع سرایند پیاچپی هستند که در درسهای گذشته و در آینده از آنها دیده و خواهیم دید.
مهمترین نکته در مورد استفاده از سرایند این است که این تابع باید قبل از هر چیز دیگر به مرورگر فرستاده شود٬ در صورت فرستادن یک نوشته و یا حتی فضای خالی قبل از این سرایند٬ خطای فرستادن سرایند داده میشود.
یک تکنیک قبل از استفاده از سرایند این است که با کمک یک تابع با نام headers_sent( ) ٬ از فرستاده شدن یا نشدن هر مقداری قبل از آن با احتیاط برخورد کنیم.
if ( !headers_sent( ) ) {
// میتوانی از تابع سراین استفاده کنی
} else {
// استفاده نشود و کار دیگری انجام شود
}
این شرطی با کمک تابع بررسی میکند که: اگر سرایندی قبلا فرستاده نشده است٬ این سرایند فرستاده شود٬ در غیر این صورت کار دیگری انجام شود. خب٬ این کمک میکند که در صورت فرستاده شدن هر چیزی قبل از تابع سرایند٬ از فرستادن آن خودداری کرده و جلوی یک ایراد را بگیریم.
اگر قبلا در بیان ثبت نام کرده اید لطفا ابتدا وارد شوید، در غیر این صورت می توانید ثبت نام کنید.