تشير الجلسة إلى الوقت المنقضي من دخول موقع الويب إلى إغلاق المتصفح عندما يتصفح المستخدم موقع الويب، أي الوقت الذي يقضيه المستخدم في تصفح موقع الويب. من التعريف أعلاه، يمكننا أن نرى أن الجلسة هي في الواقع مفهوم زمني محدد.
بشكل عام، لا يمكن استخدام المتغيرات (التي تشير إلى المتغيرات من جانب الخادم، كما هو موضح أدناه) في صفحة معينة على موقع الويب في الصفحة التالية، ومن الأسهل التعامل معها خلال الجلسة. يمكن استخدام المتغيرات المسجلة في الجلسة كمتغيرات عامة. بهذه الطريقة، يمكننا استخدام الجلسة لمصادقة هوية المستخدم، وتسجيل حالة البرنامج، ونقل المعلمات بين الصفحات.
كيف يتم تنفيذ الجلسة في إصدار PHP3؟
PHP3 نفسه لا ينفذ وظيفة الجلسة، ولا يمكننا سوى استخدام طرق أخرى لتنفيذها، وأشهرها phplib. تشمل الوظائف الأساسية لـ phplib مصادقة المستخدم وإدارة الجلسة والأذونات وتجريد قاعدة البيانات. بعد ذلك سنصف كيفية استخدام phplib لتنفيذ الجلسة.
1. قم أولاً بتثبيت phplib (البيئة هي win2000+php3.0.16+Apache1.3.12+phplib7.2c+mysql3.23.21 لـ win32).
أولاً، قم بفك ضغط phplib، حيث يوجد دليل "php" بالداخل التثبيت. على سبيل المثال: تم تثبيت Apache في الدليل d:Apache، ثم انسخ دليل "php" إلى d:Apache، وانسخ الملفات والأدلة الموجودة في دليل الصفحات لدليل phplib (باستثناء الدليل نفسه) إلى d: ضمن أباتشيhtdocs.
تحتاج مكتبة فئة phplib إلى التهيئة وفقًا للنظام، وقد يحتاج الملف local.inc إلى التعديل، والذي يحتوي على بعض المعلمات الأساسية، والتي يمكن تعديلها وفقًا للوضع الفعلي لجهازك.
قم بتغيير البرنامج في الملف d:Apachephpprepend.php إلى ما يلي:
if (!isset($_PHPLIB) أو !is_array($_PHPLIB)) {
$_PHPLIB["libdir"] = "d:/Apache/php/"; // المسار إلى دليل php ضمن phplib
}
قم بتعديل ملف d:Apachephplocal.inc:
الفئة DB_Example Extends DB_Sql {
var $Host = "localhost"; // اسم المضيف لقاعدة بيانات mysql var $Database = "test"; // اسم قاعدة البيانات var $User = "root"; // كلمة مرور مستخدم قاعدة البيانات
}
أخيرًا، يتم إنشاء الجدول الأولي استنادًا إلى الملف create_database.mysql الموجود في الدليل الفرعي الخاص بالأشياء ضمن دليل phplib.
بما أن كل صفحة تستخدم phplib يجب أن تكون قادرة أولاً على العثور على ملفات مكتبة الفئات اللازمة لتشغيل phplib، فيمكننا تعيين المتغير auto_prepend في php.ini لدعمه، ويحتوي phplib على ملف prepend.php ويحدد auto_prepend كـ "d: /". Apache/php/prepend.php" (مع علامتي الاقتباس)، ستتضمن كل صفحة تلقائيًا مكتبة فئة phplib. يمكننا أيضًا إضافة الدليل الذي توجد به مكتبة فئة phplib إلى متغير التضمين بحيث يمكن العثور على هذه الملفات. 2. قم باستدعاء الدالة page_open()
في كل صفحة تستخدم phplib، يجب عليك أولاً استدعاء الدالة page_open للتهيئة، على سبيل المثال:
<?php.
page_open(array("sess" => "Test_Session"));
?>
يتم استخدام متغيرات المصفوفة (sess) لتهيئة بعض كائنات حفظ الحالة. تجدر الإشارة هنا إلى أنه يجب استخدام الأسماء المضمنة (sess) في phplib.
نظرًا لأن phplib يستخدم ملفات تعريف الارتباط لحفظ معلومات الحالة، فيجب استدعاء وظيفة page_open() قبل إخراج محتوى الصفحة إلى المتصفح. يجب أن ينتهي البرنامج النصي php بـ page_Close()، والذي سيكتب بيانات الحالة ذات الصلة مرة أخرى إلى قاعدة البيانات، وإلا سيتم فقدان المتغيرات.
3. استخدام محدد.
بعد تسجيل المتغير، يمكنك استخدامه في الصفحات اللاحقة حتى تنتهي الجلسة. الطريقة:
<?php $sess->register( "varname"); ?>
لاحظ أن varname هنا ليس قيمة متغيرة، ولكنه اسم متغير يمكنك تحديد اسم المتغير أولاً ثم تعيين القيمة. يمكنك تغيير قيمة متغير في صفحة معينة، وسيتم الحصول على القيمة المتغيرة عند الوصول إلى المتغير في الصفحات اللاحقة. تتنوع أنواع المتغيرات ويمكن أن تكون سلسلة أو رقمًا أو مصفوفة. على سبيل المثال:
الصفحة الأولى:
<?php
page_open(array("sess" => "جلسة الاختبار"));
$sess->register( "welcome"); // سجل المتغير $welcome، لاحظ أنه ليست هناك حاجة لإضافة $
$welcome="مرحبا، عالم PHP!";
…
page_Close();
>
الصفحة الثانية :
<?php
page_open();//ابدأ الجلسة
echo $welcome;// عرض $welcome محدد في الصفحة الأولى
page_Close();//حفظ معلومات الحالة
?>
بعد تسجيل متغير، عندما تستدعي الصفحة أخيرًا وظيفة page_Close()، ستتم إعادة كتابة كل متغير جلسة إلى قاعدة البيانات. إذا نسيت استدعاء الدالة page_Close()، فلن تتم إعادة كتابة المتغيرات إلى قاعدة البيانات، الأمر الذي سيكون له عواقب غير متوقعة. عند استخدام المتغير ولم تعد هناك حاجة إليه، يمكن استدعاء الوظيفة التالية لحذف المتغير:
<?php
page_open(array("sess" => "جلسة الاختبار"));
…
$sess->unregister( "variable_name");
…
page_Close();
>
كيفية تنفيذ الجلسة في إصدار PHP4؟
تعتمد جلسة PHP4 أيضًا على ملفات تعريف الارتباط لحفظ معرفات الجلسة وتستخدم نظام الملفات لحفظ المتغيرات (افتراضيًا، لذلك لا يمكن لمتغيرات الجلسة حفظ الكائنات). وبطبيعة الحال، يمكن أيضا حفظ الجلسة في قاعدة البيانات.
هناك العديد من الوظائف المتعلقة بالجلسة في php4 (راجع مقالة تكوين php.ini للحصول على التفاصيل عادة نحتاج فقط إلى استدعاء ثلاث وظائف: session_start()، session_register()، session_is_registered()).
قم باستدعاء الدالة session_start() في بداية كل صفحة تتطلب جلسة، على سبيل المثال:
<?session_start()?>
<html><الجسم>
<؟
$welcome="مرحبا بالعالم!";
session_register("welcome");// سجل متغير الترحيب $، لاحظ أنه لا يوجد رمز $ if(session_is_registered("welcome"))// تحقق مما إذا كان متغير الترحيب $ مسجلاً echo "تم تسجيل متغير الترحيب!";
آخر
echo "لم يتم تسجيل المتغير الترحيبي بعد!";
?>
</body></html>
لتخصيص معالجة الجلسة في php4،
نحتاج إلى توسيع 6 وظائف:
·
sess_open($sess_path, $session_name);
المعلمة $sess_path تتوافق مع خيار session.save_path في ملف php.ini. المعلمة $session_name تتوافق مع خيار session.name في php.ini.
·sess_ Close();
يتم استدعاؤها عندما تنتهي الصفحة من التنفيذ ويلزم إغلاق معالج الجلسة.
·sess_read($key);
تسترد هذه الوظيفة المعرف وتعيده عندما يقرأ معالج الجلسة قيمة مفتاح الجلسة المحددة ($key بيانات جلسة $key. (ملاحظة: التسلسل هو تقنية تحفظ المتغيرات أو الكائنات في ملف في نهاية البرنامج أو عند الحاجة إليها، ثم تنقلها إلى الذاكرة عند تشغيل البرنامج أو الحاجة إليه في المرة القادمة). تختلف عن طريقة حفظ البيانات فقط )
·sess_write($key, $val);
يتم استدعاء هذه الوظيفة عندما يحتاج معالج الجلسة إلى حفظ البيانات، وهو ما يحدث غالبًا في نهاية البرنامج. وهو مسؤول عن حفظ البيانات في مكان حيث يمكن استرجاعها في المرة القادمة باستخدام وظيفة sess_read($key).
·sess_destroy($key);
تحتاج هذه الوظيفة إلى تدمير الجلسة. وهو مسؤول عن حذف الجلسة وتطهير البيئة.
·sess_gc($maxlifetime);
هذه الوظيفة مسؤولة عن تنظيف الأجزاء. وفي هذه الحالة، يكون مسؤولاً عن حذف بيانات الجلسة القديمة. يقوم معالجو الجلسة بالاتصال بهم من حين لآخر.
يمكن للبرنامج المخصص استخدام قاعدة بيانات mysql أو ملف DBM لحفظ بيانات الجلسة، اعتمادًا على الموقف المحدد. إذا كنت تستخدم mysql للحصول على الدعم، فستحتاج إلى تنفيذ الخطوات التالية:
قم أولاً بإنشاء قاعدة بيانات جلسات في mysql وإنشاء جدول جلسات:
mysql> CREATE DATABASE session;
mysql>منح تحديد الجلسات وإدراجها وتحديثها وحذفها.* إلى phpsession@localhost
-> تم تحديده بواسطة "phpsession"؛
الخلية> إنشاء جلسات الجدول (
-> sesskey char(32) ليس فارغًا،
-> انتهاء الصلاحية (11) غير موقعة وليست فارغة،
-> نص القيمة ليس فارغًا،
-> المفتاح الأساسي (sesskey)
-> );
بعد ذلك، قم بتعديل متغيرات $SESS_DB* في ملف session_mysql.php لتتوافق مع إعدادات قاعدة البيانات على جهازك:
<?
$SESS_DBHOST = "المضيف المحلي" /* اسم مضيف قاعدة البيانات*/
$SESS_DBNAME = "الجلسات" /* اسم قاعدة البيانات*/
$SESS_DBUSER = "phpsession"; /* اسم مستخدم قاعدة البيانات*/
$SESS_DBPASS = "phpsession"; /* كلمة مرور قاعدة البيانات*/
$SESS_DBH = "";
$SESS_LIFE = get_cfg_var("session.gc_maxlifetime");
……// وظيفة مخصصة
session_set_save_handler( "sess_open", "sess_ Close", "sess_read", "sess_write", "sess_destroy", "sess_gc");
>
تخصيص الواجهة عند استخدام ملفات dbm:
<؟
$SESS_DBM = "";
$SESS_LIFE = get_cfg_var("session.gc_maxlifetime");
……// وظيفة مخصصة
session_set_save_handler("sess_open", "sess_ Close", "sess_read", "sess_write", "sess_destroy", "sess_gc");
>
رمز الاختبار المخصص للجلسة:
<?php
…
if ($handler == "dbm") include("session_dbm.php");// ما هي الواجهة التي سيتم استخدامها
elseif ($handler == "mysql") include("session_mysql.php");
آخر...
session_start();
session_register("العد");
…
?>
كيفية استخدام الجلسة في المصادقة؟
يمكن استخدام الجلسة لمصادقة المستخدم:
التحقق مما إذا كان المستخدم شرعيًا:
<?
session_start();
……// عملية التحقق session_register("reguser");
?>
التحقق مما إذا كان المستخدم قد قام بتسجيل الدخول في صفحة أخرى
<؟
session_start();
if(isset($reguser)&&$reguser!=""){// إذا قمت بتسجيل الدخول echo "عزيزي المستخدم، مرحبًا بك";
}else{// إذا لم تقم بتسجيل الدخول echo "يرجى التسجيل أولاً!";
}
>
يقوم المستخدم بتسجيل الخروج:
<؟
session_destroy();
…
?>
كيفية تنفيذ جلسات متعددة تعمل بشكل متزامن؟
سؤال: عندما كنت أكتب نظام الشراء والمبيعات والمخزون لوحدتي، وجدت أنه من الضروري السماح لعدة مستخدمين بالدخول إلى تطبيق PHP في نفس الوقت. تسبب معرف الجلسة الفريد الثابت المصمم في الأصل في حدوث ارتباك في البيانات. بهذه الطريقة، يصبح إنشاء معرف جلسة فريد ديناميكيًا أولوية قصوى.
الحل بسيط: لقد استخدمت اسم ملف php + الطابع الزمني كمعرف فريد للجلسة، بحيث تكون كل جلسة في برنامجي في مكانها ولم يعد هناك أي ارتباك.
سأنشر كود المصدر الخاص بي أدناه حتى يتمكن الأصدقاء الذين لديهم نفس المشكلة من إيجاد حل.
// ابدأ جلسة PHP للحفاظ على المتغيرات.
إذا (فارغ($mysessionname)) {
$مايكرو = ميكروتايم();
$micro = str_replace(" "،"،$micro)؛ // أزل الفراغات
$micro = str_replace("."،"،$micro)؛ // قم بإزالة الفترات
$mysessionname = "po_maint" $micro;
}
session_name($mysessionname);
session_start();
ملاحظات البرنامج:
استخدم mysessionname لتمرير متغيرات اسم الجلسة الفريد بين الصفحات. إذا كنت تستخدم هذا الاسم أيضًا، فيجب عليك إجراء تغيير بسيط في البرنامج أعلاه. لا يمكن أن يكون Mysessionname هو الاسم المتغير الداخلي للجلسة لأنه موجود بالفعل قبل بدء الجلسة. لا يمكن تخزين Mysessionname في وضع ملف تعريف الارتباط، لأن الجلسات المتعددة ستحل بالتأكيد محل ملف تعريف الارتباط الأصلي. يمكنك حفظه باستخدام حقول النموذج المخفية. ثم لن تكون هناك مشكلة.