دانشگاه شهید بهشتی
ترم دوم ۹۰-۸۹

مهندسی اینترنت

گروه درسی بر روی گوگل
استاد : دکتر حسن حقیقی
استادیار : عباس نادری
آخرین به روز رسانی : ۱۱ اردیبهشت ۹۰

آموزش فارسی PHP

مقدمه

این آموزش جهت درس مهندسی اینترنت تهیه شده، لذا رویکردی مهندسی خواهد داشت. همچنین برای این مستند آموزشی موارد پیش فرض عبارتند از تسلط نسبی بر برنامه‌نویسی با جاوا یا C ، تسلط کامل بر HTML (با مطالعه این فایل ) و تسلط نسبی بر CSS (با مطالعه این فایل ).

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

نصب و راه‌اندازی

بهترین بستری که برای توسعه وب توسط PHP و MySQL یا پایگاه‌داده‌های دیگر در حال حاضر وجود دارد و به کرات نیز توسط توسعه دهندگان استفاده می‌شود، و همچنین چندسکویی نیز هست، بسته آماده XAMPP است که ابتدا برای کار در ویندوز طراحی شده بود. برای دریافت این بسته می‌توانید به سایت apachefriends.org مراحعه کنید.

پس از دریافت بسته برای سکوی خودتان، آنرا در یک آدرس سر راست نصب کنید. در هر کجای سیستم که آنرا نصب کنید، داخل پوشه اصلی برنامه پوشه‌ای با نام htdocs وجود خواهد داشت که در تنظیمات پیش فرض ریشه وب شما یا Document Root نامیده می‌شود. هر فایلی که توسط سرور وب Apache موجود در این نرم‌افزار قابل ارائه باشد در ریشه وب قرار دهید، توسط کاوشگر وب Web Browser از آدرس localhost قابل دسترسی خواهد بود (البته پس از آنکه آپاچی را اجرا نمودید).

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

برای تست کارایی سیستم، یک فایل با نام a.php در پوشه htdocs خود قرار دهید و محتوای زیر را درون آن بنویسید :

<?php
echo "Hello World";

ابتدا فایل را ذخیره نمایید. اکنون کاوشگر وب خود را به آدرس localhost/a.php هدایت نمایید. اگر پیام Hello World بر روی صفحه نمایانگر شد، راه‌اندازی شما کامل انجام شده است.

محیط کدنویسی

از آنجایی که در توسعه وب مجموعه‌ای از زبان‌های مختلف را درون یکدیگر استفاده می‌کنیم، از جمله Javascript, HTML, CSS, SQL, PHP, ... بهتر است از یک ویرایشگر قوی استفاده نماییم که امکان تشخیص تفاوت محیط‌ها و زبان‌ها را داشته باشد و بتواند مارا در تشخیص خطاها و نوشتن صحیح کد یاری کند. معروفترین ویرایشگر کد متن باز دنیا، یعنی Eclipse این ویژگی را به خوبی در نسخه PDT خود ارائه داده است. لذا با رجوع به سایت eclipse.org و تهیه بسته مربوط به سکوی خودتان، ویرایشگر را نیز خواهیم داشت. دقت داشته باشید که حتما نسخه Eclipse PDT یعنی PHP Development Tools را دریافت و نصب نمایید و نسخه‌های مربوط به جاوا، سی و زبان‌های دیگر را لازم نخواهیم داشت.

پس از نصب اکلیپس آنرا اجرا نمایید. صفحه داخلی خوش‌ آمدگویی را ببندید تا محیط اکلیپس نمایان شود. قبل از اینکه هر کاری کنیم، لازم است تا محیط کار اکلیپس را بر روی پوشه htdocs خود تنظیم نماییم، بنابراین از منوی File -> Switch Workspace -> Other پوشه کاری را بر روی پوشه htdocs خود تنظیم نمایید. با اینکار اکلیپس بسته می‌شود و مجددا اجرا می‌گردد.

برای کار کردن در اکلیپس حتما باید پروژه ساخت. هر پروژه اکلیپس یک پوشه و چندین فایل تنظیمات پروژه است. در قسمت PHP Explorer راست کلیک نمایید و یک پروژه PHP جدید بسازید. نام پروژه را یک کلمه ساده مانند test انتخاب کنید، زیرا پوشه‌ای به این نام ساخته خواهد شد و تمام آدرس‌های شما به صورت localhost/test/... خواهد بود. در پنجره نمایان شده دقت کنید که حتما گزینه Create new project in workspace انتخاب شده باشد. سپس بر روی کلید Finish کلیک نمایید.

اکنون مجددا بر روی پروژه ایجاد شده درون PHP Explorer راست کلیک کنید و New -> PHP File را انتخاب نمایید. نام فایل را b.php قرار داده Finish کنید. اکنون فایل را باز کنید و درون آن کد زیر را بنویسید :

<?php
echo "Hello";
echo "<br/>";
echo "World";

کاوشگر وب خود را به آدرس localhost/b.php هدایت نمایید و خروجی را مشاهده نمایید. اگر تا کنون با مشکلی مواجه نشده‌اید، می‌ةوانیم کار را ادامه دهیم. اگر با مشکلی مواجه شدید با من تماس بگیرید.

تمرین 1 آیا می‌توان در یک اکلیپس همزمان به زبان‌های مختلف برنامه نوشت؟

مبانی PHP

زبان PHP مخفف Hypertext Preprocessor زبانیست متن باز که توسط جامعه متن باز برای رفع نیازهای توسعه وب ایجاد شد. قبل از آن برنامه‌نویسان وب توسط زبان‌های معمولی مانند C و نوشتن CGI Script و تنظیمات دشوار سرور وب خود، به همراه قسمت زیادی کد تکراری موفق به ایجاد صفحات پویای وب می‌کردند. اکنون زبان‌هایی مانند PHP اینکار را ساده کرده‌اند و برنامه‌نویس تمام توان خود را معطوف توسعه وب می‌نماید تا کار با زبان برنامه‌سازی. PHP در حال حاضر دومین زبان برنامه‌نویسی پر استفاده دنیا و اولین زبان پر استفاده توسعه وب است.

سایت رسمی PHP یعنی php.net شامل آموزش، توضیحات، نکات، یادداشت‌های کاربران، معضلات فنی و امنیتی و تمام جزئیات دیگر مربوط به PHP در قالبی بسیار ساده و قابل درک است. اگر تابعی از PHP را لازم داشتیم و جزئیات کار آنرا نمی‌دانستیم با یک سر زدن به این سایت مشکل حل خواهد شد (البته Eclipse PDT لیست توابع PHP به همراه راهنمای آنان را دارد).

زبان PHP از دسته زبان‌های Loosely Typed است، یعنی متغیرهای آن نوع دارند ولی برنامه‌نویس کاری به نوع متغیر نخواهد داشت و تنها از متغیر‌ها استفاده می‌کند (وقتی نوع نداریم تعریف متغیر هم نداریم). به عنوان مثال قطعه کد زیر را در نظر بگیرید :

<?php
$a=1;
$b=2;
$c=$a+$b; 		//3
$d="Three is ".$c; 	// 'Three is 3'
$e="12345";
$f=$e/2; 		// 6172.5
?>

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

برای دیدن مقدار دقیق و نوع یک متغیر در خروجی، کافیست از دستور var_dump($variable); استفاده نماییم، که معمولا برای اهداف رفع خطا استفاده می‌شود. برنامه بالا را به صورت زیر تغییر دهید :

<?php
$a=1;
var_dump($a);
$b=2;
var_dump($b);
$c=$a+$b; 		//3
var_dump($c);
$d="Three is ".$c; 	// 'Three is 3'
var_dump($d);
$e="12345";
var_dump($e);
$f=$e/2; 		// 6172.5
var_dump($f);
?>

جهت اجرای یک برنامه PHP کافیست فایل آنرا ذخیره کرده، آن فایل را درون کاوشگر وب خود مشاهده نمایید. مثلا اگر برنامه فوق را در فایل .../htdocs/test/var.php نوشته باشید، کافیست به آدرس localhost/test/var.php مراجعه نمایید. همچنین دقت داشته باشید که تمام برنامه‌های PHP داخل دو تگ (برچسب) <?php و ?> قرار می‌گیرند و هرچیزی که خارج این دو برچسب باشد مستقیما خروجی برنامه می‌شود (مثل اینکه درون دستور echo قرار گرفته باشد). این هم به دلیل آنست که قسمت عمده یک برنامه PHP خروجی دادن است و بخش محاسباتی و برنامه‌ای آن حجم کمتری دارد. بنابراین خروجی اجرای برنامه فوق به شکل زیر خواهد بود :

int(1) int(2) int(3) string(10) "Three is 3" string(5) "12345" float(6172.5) 

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

<?php

# this is a comment in PHP, as well as //

# Simple Array
$a[1]=5;
$a[]=7;  // equals a[2]=7;
$a[3]='Hello'; 

var_dump($a);
echo "<br/>";


# Simple Associative Usage of Array
$a[1]=5;
$a['two']=7;
$a['hello']='world';

var_dump($a);
echo "<br/>";

# Stack
$newValue="I'm a new value!";
array_push($a,$newValue);
$topValue=array_pop($a);

var_dump($a);
echo "<br/>";
var_dump($topValue);
echo "<br/>";


# Queue
array_push($a, $newValue);
$firstValue=array_shift($a);

var_dump($a);
echo "<br/>";
var_dump($firstValue);
echo "<br/>";


# Hash reading
foreach ($a as $key=>$value)
	echo $key . " : " . $value . "<br/>";  


# Tree

$b[]="2-1";
$b[]="2-2";

$a[]=1;
$a[]=$b;
$a[]=array ("3-1","3-2", 3=>"3-3");
$a[]=array (1=>"4-1",2=>$b); 

var_dump($a);
echo "<br/>";

?>

پس از بررسی و اجرای قطعه کد فوق باید با توانمندی PHP در نگهداری انواع داده در نوع ساده Associative Array آشنایی کامل پیدا کرده باشید. برای توضیحات بیشتر می‌توانید به کتاب‌های آموزشی یا سایت PHP مراجعه کنید. ضمنا می‌توانید برای مشاهده نسخه تمیز‌تر خروجی کد فوق، Source صفحه HTML بارگزاری شده در کاوشگر را مطالعه نمایید که به شرح زیر خواهد بود :

array(3) {
  [1]=>
  int(5)
  [2]=>
  int(7)
  [3]=>
  string(5) "Hello"
}
<br/>array(5) {
  [1]=>
  int(5)
  [2]=>
  int(7)
  [3]=>
  string(5) "Hello"
  ["two"]=>
  int(7)
  ["hello"]=>
  string(5) "world"
}
<br/>array(5) {
  [1]=>
  int(5)
  [2]=>
  int(7)
  [3]=>
  string(5) "Hello"
  ["two"]=>
  int(7)
  ["hello"]=>
  string(5) "world"
}
<br/>string(16) "I'm a new value!"
<br/>array(5) {
  [0]=>
  int(7)
  [1]=>
  string(5) "Hello"
  ["two"]=>
  int(7)
  ["hello"]=>
  string(5) "world"
  [2]=>
  string(16) "I'm a new value!"
}
<br/>int(5)
<br/>0 : 7<br/>1 : Hello<br/>two : 7<br/>hello : world<br/>2 : I'm a new value!<br/>array(9) {
  [0]=>
  int(7)
  [1]=>
  string(5) "Hello"
  ["two"]=>
  int(7)
  ["hello"]=>
  string(5) "world"
  [2]=>
  string(16) "I'm a new value!"
  [3]=>
  int(1)
  [4]=>
  array(2) {
    [0]=>
    string(3) "2-1"
    [1]=>
    string(3) "2-2"
  }
  [5]=>
  array(3) {
    [0]=>
    string(3) "3-1"
    [1]=>
    string(3) "3-2"
    [3]=>
    string(3) "3-3"
  }
  [6]=>
  array(2) {
    [1]=>
    string(3) "4-1"
    [2]=>
    array(2) {
      [0]=>
      string(3) "2-1"
      [1]=>
      string(3) "2-2"
    }
  }
}
<br/>

همچنین توجه داشته باشید که به دلیل اینکه اندیس‌های Associative Array نه تنها عددی نیست، بلکه لزوما پشت سر هم نیز نیست، نمی‌توان با حلقه for معمولی به عناصر آن دسترسی داشت، لذا از حلقه‌های معروف foreach که در همه زبان‌های جدید وجود دارند استفاده شده است.

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

phpinfo();

تمرین 2 : سعی کنید با استفاده از آرایه‌های PHP یک گراف بسازید.

پیوندهای بیشتر

  • http://php.net/manual/en/tutorial.php
  • http://www.w3schools.com/PHP/DEfaULT.asP
  • http://www.tizag.com/phpT/

ماهیت وب و HTTP

تا اینجای کار نحوه کار کردن با زبان برنامه‌نویسی PHP را فرا گرفتیم. اما وب ماهیتا با برنامه‌های Desktop تفاوت دارد، زیرا تعاملی و Interactive نیست. در پروتکل HTTP که زیربنای فنی وب را تشکیل می‌دهد، هر کاوشگر وب که یک Client است یک درخواسات (Request) به سرور وب ارسال می‌کند. سرور وب درخواست را پردازش می‌کند و پاسخ آنرا در قالب‌های مختلف به کلاینت باز می‌گرداند.

در میان قالب‌هایی که سرور وب بر می‌گرداند (Response)، چندین قالب توسط کاوشگر قابل نمایش است، از جمله HTML، تصاویر و ... . قالب‌هایی که کاوشگر امکان نمایش آنها را ندارد، به کاربر خود پیشنهاد دانلود و ذخیره آنها بر روی دیسک را می‌دهد.

سرور وب پس از دریافت درخواست، بر اساس تنظیمات خود تشخیص می‌دهد که درخواست را چگونه پردازش نماید. اگر درخواست خواهان یک صفحه پویا باشد (در تنظیمات پیش فرض فایلی که پسوند .php دارد) سرور وب درخواست را به پردازنده PHP منتقل می‌کند تا برنامه‌ای را اجرا نموده، پاسخ را به صورت پویا تحویل دهد (نه به صورت ایستا و همواره یکسان).

از انجایی که وب تعاملی نیست بلکه Request/Response ای است، در هر درخواست آن که به پردازنده PHP منتقل می‌شود، کل کد کاملا اجرا می‌شود و کل خروجی آن به سرور وب برگردانده می‌شود. بنابراین امکان دریافت ورودی تعاملی در هنگام اجرای برنامه وجود ندارد. بنابراین ورودی برنامه‌های وب از طریق پارامترهای موجود در درخواست (Request) وب تامین می‌شوند و از ابتدای برنامه در دسترس است.

معمولا اسکریپت‌های PHP که احتیاج به ورودی خاصی دارند، شامل دو بخش هستند. در بخش اول، در صورتی که ورودی مورد نظر در درخواست موجود نباشد، فرمی را جهت وارد کردن اطلاعات ورودی به کاربر نمایش (خروجی) می‌دهند تا آنرا پر کرده، درخواست خود را مجددا به همان آدرس ولی ایندفعه با پارامتر‌های ورودی ارسال نماید. سپس در بخش دوم اسکریپت، در صورتی که ورودی در درخواست موجود باشد، آنرا پردازش می‌کنند و بر اساس آن خروجی مناسب را به کاربر تحویل می‌دهند. به عنوان مثال به قطعه کد زیر توجه فرمایید :

<?php
# put this code in file input.php

if (isset ($_GET['myname'])) // we have input
{
	echo "Hello ".$_GET['myname'];
}
else
{
	?>
	<form>
	Enter your name : <input type='text' name='myname' />
	<br/>
	<input type='submit' />
	</form>
	<?php
}

در اجرای این برنامه، درخواست اول شما شامل هیچگونه پارامتر ورودی نیست، برنامه این را با بررسی کردن متغیر سراسری $_GET که تمام پارامترهای ورودی که با متد GET ارسال شده‌اند را در خود دارد، متوجه می‌شود که آیا پارامتری با نام myname وجود دارد یا خیر. در صورتی که این پارامتر وجود داشته باشد، سلامی به آن نام خروجی می‌دهد. در صورتی که پارامتر وجود نداشته باشد، اسکریپت فرمی را خروجی می‌دهد.

اکنون که فرم خروجی داده شده است، کاربر آن را پر می‌کند و با کلیک کردن بر روی کلید Submit باعث می‌شود مجددا درخواست HTTP جدیدی به همان اسکریپت PHP ارسال شود، با این تفاوت که ایندفعه پارامتر myname با متد GET مقدار دارد و به سرور ارسال شده است.

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

تمرین 3 : اسکریپتی بنویسید که با دریافت سه نمره از یک کاربر، معدل او را خروجی دهد.

تمرین 4 : با نصب افزونه Live HTTP Headers و یا افزونه Tamper Data بر روی کاوشگر Firefox یا افزونه‌های مشابه در کاوشگرهای دیگر، سرآیند‌های HTTP را بررسی کنید.

انواع درخواست وب

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

  • درخواست‌های GET
  • درخواست‌های POST

همانگونه که در مثال قبلی نیز مشاهده نمودید، درخواست‌های GET با تغییر آدرس URL خود را ارائه می‌کنند و در صورتیکه صفحه را بازخوانی (Refresh) کنید، مجددا به سرور ارسال خواهند شد (زیرا درون آدرس هستند). محدودیت اصلی درخواست‌های GET نمایان بودن انها و طول کم آنهاست، بنابراین برای ارسال داده‌هایی با حجوم قابل توجه و یا داده‌هایی که نباید نمایان باشند، از درخواست‌های POST استفاده می‌کنیم. برای درک تفاوت بیشتر این دو نوع درخواست، اسکریپت زیر را تست نمایید :

<?php
echo "<h3>Post Data : </h3>";
echo nl2br(print_r($_GET,true));
echo "<h3>Post Data : </h3>";
echo nl2br(print_r($_POST,true));
?>
<p> To test this, use the get form first. Then while inspecting your URL, use post form.
Afterwards try to refresh the page.</p> 

<h2>Get Form</h2>
<form method='get'>
Count : <input type='text' name='count' /><br/>
<input type='submit' value='Send as Get' /> 
</form>

<h2>Post Form</h2>
<form method='post'>
Name : <input type='text' name='m_name' /><br/>
Surname : <input type='text' name='m_surname' /><br/>
<input type='submit' value='Send as Post' />
</form>

دستور print_r به مانند var_dump یک متغیر را خروجی می‌دهد با این تفاوت که نوع آنرا اعلام نمی‌دارد. اگر پارامتر دوم این دستور صحیح شود، به جای خروجی دادن مقدار را در یک رشته باز می‌گرداند. دستور nl2br در واقع کاراکترهای انتهای خط (Newline) را به عبارت <br/> تبدیل می‌نماید.

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

تمرین 5 : برنامه‌ای بنویسید که با پردازش آرایه $_GET بتواند قسمت از علامت سوال به بعد آدرس خود را بسازد. (راهنمایی : به تابع urlencode احتیاج است)

پیوندهای بیشتر

  • http://www.tizag.com/phpT/forms.php
  • http://www.w3schools.com/php/php_forms.asp
  • http://myphpform.com/php-form-tutorial.php

مدیریت نشست

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

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

برای رفع این مشکل و تشکیل نشست، از یک تکنولوژی ساده در پروتکل HTTP استفاده می‌شود. تکنولوژی cookie که در ابتدا جهت نگهداری اطلاعات غیرضروری (از جمله ابعاد صفحه)‌ یک سایت خاص در سیستم کلاینت به صورت متنی و بسیار ساده استفاده می‌شد، امروزه به ابزار اصلی مدیریت نشست در وبسایت‌ها مبدل گشته است، به طوری که بسیاری از سایت‌ها بدون وجود cookie امکان کارکرد صحیح ندارند.

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

  1. اگر کلاینت در کوکی خود داده‌ای با نام SessionID تحویل من ندارد، یک عدد تصادفی و بسیار بزرگ به عنوان SessionID ایجاد می‌کنم و به عنوان مقداری که در کوکی ذخیره کند به او تحویل می‌دهم. همچنین این عدد را در لیست خود اضافه می‌کنم.
  2. اگر کلاینت در کوکی خود داده‌ای با نام SessionID تحویل داد، در لیست خود به دنبال آن می‌گردم تا متوجه شوم من آن را صادر کرده‌ام یا خیر.
  3. اگر صادره خود من بود، از داخل لیست اطلاعات فعالیت‌هایی که این کاربر تاکنون انجام داده است دریافت می‌کنم و متوجه وضعیت کاربر می‌شوم.
  4. اگر صادر نکرده بودم به شماره ۱ می‌روم و مجددا برای او صادر می‌کنم.
  5. اگر درخواست کاربری که در لیست من هست، به اندازه زمان t (معمولا نیم ساعت) از آخرین درخواست او فاصله زمانی داشت، شماره او را از لیست خارج و کوکی او را باطل اعلام می‌کنم. (زیرا ممکن است از پشت سیستم بلند شده باشد و کاربر دیگری جای او نشسته باشد و نباید به اطلاعات او دسترسی داشته باشد)

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

تمرین 6 : یک نفوذکر، با داشتن چه اطلاعاتی می‌تواند خود را جای فرد دیگری جا بزند؟

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

تمرین 7 : برنامه‌ای بنویسید که با ایجاد نشست، ابتدا در یک صفحه نام کاربر، سپس نام خانوادگی او در صفحه‌ای دیگر را دریافت کند و در صفحه سوم همه اطلاعات را خروجی دهد.

پیوندهای بیشتر

  • http://www.learnphp-tutorial.com/Sessions.cfm
  • http://www.linuxdocs.org/HOWTOs/PHP-HOWTO-15.html
  • http://www.learnphp.org/tutorials/PHP-Session-Management-Tutorial-Part-2-Storing-and-Retrieving-Data-61679.html
بازگشت پیشنهاد انتقاد

Site Footer

Sliding Sidebar