بدايتك الى الـsession
الـ session هي عبارة عن تقنية للترابط مع المستخدم وهي موجودة ضمن الـPHP4 ولم تكن موجودة ضمن الإصدارات التي قبله بل كان يجب أن تقوم بتركيب مكتبة لكي تستطيع استخدام هذه التقنية ، يعتمد فهمنا للـsession على فهمنا لل****ز وكيفية استعمالها ولقد تكلمنا عن ال****ز بشكل جيد في الدرس السابق ، يستخدم الـsession لعمل ميكانيكية تواصل بين المستخدم والسيرفر ، فلقد قلنا أن الـhttp لا يوفر لنا ميكانيكية لعمل تواصل ، فإذا طلب المستخدم صفحة من السيرفر فإن السيرفر يقوم بإعطائه ما أراد وينتهي عند ذلك فلا يعرف إن كان هو نفس المستخدم أو ليس هو ... لأجل ذلك تم انشاء تقنية الـsession لأجل عمل تقنية تواصل بين المستخدم والموقع ، فبإستطاعتك مثلاً أن تقوم بتحديد عدد زيارات مستخدم معين لصفحتك ليوم واحد أو لأسبوع أو لمدة معينة من الوقت .... أو يمكنك عمل متجر إلكتروني بسيط يستطيع المستخدم شراء عدة أشياء دفعة واحدة من الموقع ويكون على تواصل بينه وبين الموقع عندما يقوم بإضافة مشترى إلي سلة التسوق أو حذف مشتريات.
قبل أن أتكلم عن كيفية استخدام الـSession وإعطاء بعض الأمثلة البسيطة ، سأقوم بالتكلم عن كيفية إعداد الـsession مع الـPHP .
اعدادات الـsession في الـPHP
لكي تستطيع التعامل مع الـsession بشكل جيد يجب عليك أن تتعرف على بعض الإعدادات التي في ملف الـphp.ini
عندما تفتح الملف ستجد قسماً خاصاً فيه بالـsession هناك حوالى 19 إعداد ولكن لن نتطرق إليها كلها بل سنتكلم عن الأساسية والمهمة منها فقط كبداية لنا للتعرف على الـsession وكيفية عمله .
اعداد طريقة التخزين
session.save_handler (files | mm | user)
ستجد هذه العبارة مكتوبة في الملف كالتالى بشكل افتراضي :
session.save_handler = files
وهذا الإعداد يقوم بتحديد طريقة التخزين للـsession وهناك ثلاث حالات للتخزين :
1 - التخزين في ملفات عادية على السيرفر :
session.save_handler = files
2 - التخزين على ذاكرة السيرفر :
session.save_handler = mm
3 - التخزين بطريقة أخري معرفة ومعينة من قبل المستخدم مثل التخزين في قواعد البيانات وهذا ما سوف نقوم بالتفصيل عنه بعد الكلام عن قواعد البيانات :
session.save_handler = user
يجب أن تأخذ في اعتبارك عدد الملفات التي سيقوم الـsession بتخزينها عند استخدامك للأعداد الأول والإفتراضي خاصة عندما يكون عدد الزوار بالمئات أو الآلاف .
قد يكون استعمال الذاكرة أسرع ولكن المشكلة أنه من السهل مسح البيانات منها ببساطة .
الطريقة الثالثة قد تكون أكثر الطرق مرونة ، ولكنها معقدة وصعبة جداً ، وهي تعطيك مرونة لتخزين البيانات في أي وسائط مدعومة من قبل الـPHP مثل قواعد بيانات mysql و oracle .
الذي افترضه الآن أنك قمت بوضع قيمة هذه الخاصية إلى files
إعداد مكان التخزين
session.save_path (path/to/directory)
هذه الخاصية مفيدة إذا كنت قد ضبط الإعداد السابق إلى files
تقوم هذه الخاصية بتحديد مكان التخزين على السيرفر ومن الأفضل أن تقوم بتحديد مكان التخزين بعيداً عن مجلد السيرفر لكي تمنع تصفح هذه الملفات .
الإنشاء التلقائي للـsession
session.auto_start (0 | 1)
هذا الإعداد يقوم بتحديد إذا ما كان الـsession سيتم إنشاؤه تلقائياً عند كل زيارة للموقع أو لأي صفحة من صفحاته بدون إدراج كود الـsession في كل صفحة ... وعلى ذلك فإنك تقوم بوضع القيمة إلى (1) إذا أردت ذلك .
وعلى إفتراض أنك لا تحتاج إلى أن تجعل الـPHP يقوم بعمل session لكل صفحة تلقائياً ومن غير طلب فستقوم بوضع قيمة هذا الإعداد الى (0)
الـSID
عندما يقوم الزائر بزيارة صفحتك فإن الـsession يستطيع تتبع هذا الزائر وعدد المرات التي قام فيه الزائر بالدخول لليوم الواحد ، يقوم الـPHP بعمل SID (session identefier) أو رقم معرف تلقائي بشكل افتراضي عندما تقوم بطلب إنشاء session بالزائر ، وكل رقم معرف يختلف عن الآخر تماماً ، إن رقم المعرف الذي ينشئه الـPHP شبيه للشكل التالى :
fc94ad8b1ee49ef79c713ee98ac1fcc4
هناك طريقتين يستطيع بها الـPHP متابعة الـSID للمستخدم :
1 - عن طريق المتابعة والتخزين بتسلسل في ال****ز .
2 - عن طريق اتباع رقم المعرف بعنوان الصفحة في الانترنت .
سنأخذ أمثلة عن كلا الطريقتين :
1 - استخدام ال****ز
بالطبع هذه هي أكثر الطرق شيوعاً للحصول على ترابط بين المستخدم والموقع وهي الأسهل ، ولكن يجب أن تضع في اعتبارك أن المستخدم قد يكون قد ألغي أو منع ميزة ال****ز في المتصفح أو قد يكون متصفحه لا يدعم ال****ز .
خذ في اعتبارك أن بعض المتصفحات لا تسمح بأن يزيد حجم ال****ز عن 5 كيلوبايت .
هناك بعض الإعدادات البسيطة في ملف php.ini التي يجب معرفة معلومات عنها قبل البدء باستخدام الـsession مع ال****ز :
session.use_******s (0 | 1)
هذه الخاصية تحدد ماذا كان يمكنك استخدام ال****ز مع الـsession أو لا وعند وضع القيمة (0) فهذا يمنعك من استخدام ال****ز مع الـ(session) وأما اذا كانت قيمته (1) فهذا يسمح باستخدام ال****ز مع الـsession
session.name (Default: PHPSESSID)
هذا الإعداد يقوم بتحديد اسم ال****ز الذي سيحتفظ برقم المعرف (SID) والإعداد الافتراضي هو PHPSESSID ولن اقوم بتغيير هذا الإعداد لكي تستطيع فهم المثال الذي سأطرحه بعد قليل
session.******_lifetime (Default: 0)
يقوم هذا الإعداد بتحديد المدة التي سيبقي فيها ال****ز الذي يحتفظ بقيمة الـ(SID) والإعداد الافتراضي هو صفر ، أي أنه سيتم مسح ال****ز تلقائياً بعد اغلاق المستخدم لنافذة المتصفح مباشرة
session.******_path (Default: /)
يقوم هذا الإعداد بتحديد مسار دومين يتم تخزين ال****ز له .. لا تقم بتغيير قيمته ودعه كما هو
session.******_domain (Default: null)
يقوم هذا الإعداد بتعريف اسم دومين يتم تخزين ال****ز لصالحه .. والقيمة الافتراضية هي null ، لا تقم بتغييرها
ضع في اعتبارك انه اذا كانت قيمه الاعداد (session.use_******s) تساوي واحد فان لا داعي لاستدعاء الدالة set_******() لإعداد ال****ز بل سيتم اعدادها تلقائياً بواسطة الـPHP
2 - الإضافة أوالكتابة إلى عنوان الصفحة
إن إضافة عنوان الـSID إلى عنوان الصفحة يعتبر من الأشياء البشعة جداً رغم أن طريقته سهلة ومفيدة في حالة ما إذا كان ال****ز غير مدعوم في المتصفح بشكل جيد
مثال :
<a href="configure.php?<?=SID?>">Go to the configuration page</a>
بهذه الطريقة نقوم بإضافة المتغير المرجعي SID الذي سيقوم بإعطاء رقم معرف للمستخدم .
متابعة الـsession
لقد أخذنا حتي الآن معلومات تجعلنا ندخل عالم البرامج المسيره بالـsession بدون خوف ، سأبدأ الآن في طرح بعض الأمثلة البسيطة التي تثبت لديك بعض المفاهيم الأساسيه في الـsession ... سأشرح في هذا المثال كيفية إنشاء الـSID وتخزينه لاستعماله لاحقاً ، وخلاصة السيناريو للصفحة أننا نريد من المستخدم أن يفهم أنه يستطيع نخصيص لون الخلفية الذي يريد أن يشاهد به صفحات موقعنا ... سأقوم بتخزين قيمة مبدئية في المتغير الذي يقوم بتحديد لون الصفحة ، أنا افترض طبعاً أن المتصفح يدعم ال****ز :
سكربت يقوم بانشاء وتسجيل متغير session
<?
session_start();
session_register("zx");
session_register("co");
$zx=10;
$co++;
echo 'مرحبا بك في موقعنا أيها الزائر الكريم '."<br>";
echo "عدد زياراتك لهذه الصفحة=". $co ;
echo "<br>";
echo '<a href="php2.php">الصفحة الثانية</a>';
?>
اقصد بالجلسة هي الـ(session) وإن كانت الترجمة غير صحيحة ولكن فقط نأخذه كمصطلح .
متغير الجلسة هو الـ(session-variable) أو متغير الـsession أو سمه ما شئت .
الشرح
يقوم هذا السكربت في البداية بإنشاء متغير اسمه (zx) ومتغير اسمه (co) وقمنا بإعطاء القيمة (10) للمتغير (zx) وقمنا بزيادة القيمة الموجودة (وهي الصفر) في (co) بواحد وكتبنا مرحبا بك ايها الزائر الكريم في موقعنا ، ثم قلنا له إن عدد زياراتك لهذه الصفحة هي قيمة المتغير( co ) ثم اعطيناه رابط للصفحة الثانية .
في الواقع إن هذه المتغيرات وقيمها يتم الاحتفاظ بها في ****ز له اسم خاص قمنا بتحديده سابقاً من ملف PHP.ini ، وهذا ال****ز يحتفظ بقيمة الـSID للـsession .
نحن لا نقوم بإخبار الـPHP أين سيحتفظ بقيمة المتغيرات لأننا بدأنا بكلمة الـ:
session_start();
وعلى هذا فإن الـPHP سيفهم أنه سيقوم بتخزين القيمة في ال****ز الخاص بالـsession .
قمنا بجعل المتغير co كعداد بسيط لعدد المرات التي سوف نقوم بها يزيارة الصفحة فعند عمل تحديث للصفحة سيتم زيادة العداد بمقدار واحد
$c++;
وطبعاً قبل زيادة العداد بقيمة واحد فإنه يتم حساب القيمة السابقة للمتغير عند إنشاءه تلقائياً ... ومن ثم يتم الزيادة وبعد ذلك طباعة القيمة .
كتابة رقم الـSID
اكتب الآن الكود التالي واحفظه باسم php2.php
<?
session_start();
echo $PHPSESSID ."<br>";
echo $zx;
?>
في هذه الصفحة نقوم بطباعة قيمة الـSID وذلك بطباعة قيمه المتغير $PHPSESSID (الذي هو اسم ال****ز الخاصة بالـsession ) .
بعد ذلك قمنا في النهاية بطباعة قيمة المتغير $zx لكي ألفت نظرك بأن ال****ز ما زال يحتفظ بها ولم يفقدها لأننا قد حددنا الإعداد في ملف php.ini الخاص بوقت ال****ز الـ 3600 أي لمده ساعة ثم بعد تلك الساعة سيتم مسح ال****ز ولن يمكنك استرجاع قيمة أي متغير :
session.******_lifetime = 3600
واضف إلى معلوماتك أنه لا يمكنك قراءة القيم لل****ز الخاصة بالـsession إلا عن طريق إضافه الأمر
session_start();
يجب أن تبدأ بهذا الأمر دائماً إذا أردت قراءة قيم المتغيرات التي يحتفظ بها ال****ز الخاص بالـsession .
مسح متغير من الـsession
كل ما عليك فعله هو استخدام هذه الدالة :
session_unregister(variable name);
تقوم بوضع اسم المتغير في مكان الـ(variable name)
مثال :
session_unregister(“brn”);
سيقوم هذا الأمر بمسح المتغير (brn) من الـ****ز الخاصة بالـ(session)
قراءة قيم المتغيرات في الـ****ز الخاصة بالـsession
كل ما عليك فعله هو استخدام الدالة :
session_encode();
مثال :
<?
session_start();
session_register("bgcolor");
session_register("name");
session_register("email");
$bgcolor = "#8080ff";
$name = "alfareees almolthem";
$email = "php@php.com";
$e = session_encode();
print "The encoded string is: $e";
?>
بهذا السكربت نكون قد أنهينا درسنا عن مقدمة بسيطة للـsession . هذه مجرد مقدمة ولكي نستطيع أن نتعمق بالـsession فيجب علينا أن نتعلم شيئاً عن قواعد البيانات .
منقوووول للافادة
hg]vs hguhav(f]hdj; hgn hgJsession)