เซสชัน หมายถึง เวลาที่ผ่านไปจากการเข้าสู่เว็บไซต์จนถึงการปิดเบราว์เซอร์เมื่อผู้ใช้เรียกดูเว็บไซต์ ซึ่งก็คือ เวลาที่ผู้ใช้ใช้ในการเรียกดูเว็บไซต์ จากคำจำกัดความข้างต้น เราจะเห็นว่าจริงๆ แล้ว Session เป็นแนวคิดเรื่องเวลาที่เฉพาะเจาะจง
โดยทั่วไปแล้ว ตัวแปร (อ้างอิงถึงตัวแปรฝั่งเซิร์ฟเวอร์ เหมือนกันด้านล่าง) ในบางหน้าบนเว็บไซต์ไม่สามารถใช้ในหน้าถัดไปได้ง่ายกว่าในการจัดการกับเซสชัน ตัวแปรที่ลงทะเบียนในเซสชันสามารถใช้เป็นตัวแปรร่วมได้ ด้วยวิธีนี้ เราสามารถใช้เซสชันสำหรับการตรวจสอบตัวตนของผู้ใช้ การบันทึกสถานะของโปรแกรม และการถ่ายโอนพารามิเตอร์ระหว่างเพจ
เซสชันถูกนำไปใช้ในเวอร์ชัน 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: ภายใต้ Apachehtdocs
จำเป็นต้องเริ่มต้นไลบรารีคลาส phplib ตามระบบ และอาจจำเป็นต้องแก้ไขไฟล์ local.inc ซึ่งมีพารามิเตอร์พื้นฐานบางอย่าง ซึ่งสามารถแก้ไขได้ตามสถานการณ์จริงของเครื่องของคุณเอง
เปลี่ยนโปรแกรมในไฟล์ d:Apachephpprepend.php เป็นดังนี้:
if (!isset($_PHPLIB) หรือ !is_array($_PHPLIB)) {
$_PHPLIB["libdir"] = "d:/Apache/php/"; //เส้นทางไปยังไดเรกทอรี php ภายใต้ phplib
}
แก้ไขไฟล์ d:Apachephplocal.inc:
คลาส DB_Example ขยาย DB_Sql {
var $Host = "localhost"; // ชื่อโฮสต์ของฐานข้อมูล mysql var $Database = "test"; // ชื่อฐานข้อมูล var $User = "root"; // ชื่อผู้ใช้ฐานข้อมูล var $Password = "1234567"; // รหัสผ่านผู้ใช้ฐานข้อมูล
}
สุดท้ายนี้ ตารางเริ่มต้นจะถูกสร้างขึ้นตามไฟล์ create_database.mysql ในไดเร็กทอรีย่อยของ stuff ภายใต้ไดเร็กทอรี phplib
เนื่องจากทุกเพจที่ใช้ phplib จะต้องสามารถค้นหาไฟล์ไลบรารีของคลาสที่จำเป็นในการรัน phplib ก่อน เราจึงสามารถตั้งค่าตัวแปร auto_prepend ใน php.ini ให้รองรับได้ Apache/php/prepend.php" (พร้อมเครื่องหมายคำพูด) แต่ละหน้าจะรวมไลบรารีคลาส phplib โดยอัตโนมัติ นอกจากนี้เรายังสามารถเพิ่มไดเร็กทอรีที่มีไลบรารีคลาส phplib อยู่ในตัวแปร include เพื่อให้สามารถค้นหาไฟล์เหล่านี้ได้ 2. เรียกใช้ฟังก์ชัน page_open()
ในทุกเพจที่ใช้ phplib คุณต้องเรียกใช้ฟังก์ชัน page_open เพื่อเริ่มต้นก่อน เช่น:
<?php
page_open(array("sess" => "Test_Session"));
?>
ตัวแปรอาร์เรย์ (sess) ใช้เพื่อเริ่มต้นออบเจ็กต์การบันทึกสถานะบางอย่าง ควรสังเกตไว้ที่นี่: ต้องใช้ชื่อในตัว phplib (sess)
เนื่องจาก 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->ยกเลิกการลงทะเบียน( "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");//ลงทะเบียนตัวแปร $welcome โปรดทราบว่าไม่มีสัญลักษณ์ $ if(session_is_registered("welcome"))//ตรวจสอบว่าตัวแปร $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> สร้างเซสชันฐานข้อมูล;
mysql>GRANT เลือก, แทรก, อัปเดต, ลบบนเซสชัน* ไปที่ phpsession@localhost
-> ระบุโดย 'phpsession';
mysql> สร้างเซสชันตาราง (
-> sesskey char (32) ไม่เป็นโมฆะ
-> หมดอายุ int (11) ไม่ได้ลงนามไม่เป็นโมฆะ
-> ข้อความค่าไม่เป็นโมฆะ
-> คีย์หลัก (sesskey)
-> );
ถัดไป แก้ไขตัวแปร $SESS_DB* ในไฟล์ session_mysql.php เพื่อให้ตรงกับการตั้งค่าฐานข้อมูลบนเครื่องของคุณ:
<?
$SESS_DBHOST = "localhost"; /* ชื่อโฮสต์ฐานข้อมูล*/
$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") รวม("session_mysql.php");
อย่างอื่น…
session_start();
session_register("นับ");
-
?>
จะใช้ Session ในการรับรองความถูกต้องได้อย่างไร?
สามารถใช้เซสชันสำหรับการตรวจสอบผู้ใช้:
ตรวจสอบว่าผู้ใช้ถูกต้องหรือไม่:
<?
session_start();
……//กระบวนการตรวจสอบ session_register("reguser");
?>
ตรวจสอบว่าผู้ใช้เข้าสู่ระบบในหน้าอื่นหรือไม่
<?
session_start();
if(isset($reguser)&&$reguser!="""{//หากคุณได้เข้าสู่ระบบ echo "เรียนคุณผู้ใช้ ยินดีต้อนรับ";
}else{//หากคุณไม่ได้เข้าสู่ระบบ echo "กรุณาลงทะเบียนก่อน!";
-
?>
ผู้ใช้ออกจากระบบ:
<?
session_destroy();
-
?>
จะดำเนินการหลายเซสชันที่ทำงานพร้อมกันได้อย่างไร?
คำถาม: ตอนที่ฉันเขียนระบบการซื้อ การขาย และสินค้าคงคลังสำหรับหน่วยของฉัน ฉันพบว่าจำเป็นต้องอนุญาตให้ผู้ใช้หลายคนเข้าสู่แอปพลิเคชัน PHP ในเวลาเดียวกัน รหัสเซสชันเฉพาะแบบคงที่ที่ออกแบบแต่เดิมทำให้เกิดความสับสนของข้อมูล ด้วยวิธีนี้ การสร้าง ID เซสชันที่ไม่ซ้ำกันแบบไดนามิกจึงกลายเป็นเรื่องสำคัญสูงสุด
วิธีแก้ปัญหานั้นง่ายมาก: ฉันใช้ชื่อไฟล์ php + การประทับเวลาเป็น ID เซสชันที่ไม่ซ้ำกัน เพื่อให้แต่ละเซสชันในโปรแกรมของฉันอยู่ในตำแหน่งเดิม และไม่มีความสับสนอีกต่อไป
ฉันจะเผยแพร่ซอร์สโค้ดของฉันด้านล่างเพื่อให้เพื่อนๆ ที่มีปัญหาเดียวกันสามารถค้นหาวิธีแก้ไขได้
//เริ่มเซสชัน PHP เพื่อรักษาตัวแปร
ถ้า (ว่าง($mysessionname)) {
$ไมโคร = ไมโครไทม์();
$micro = str_replace(" ","",$micro); // ตัดช่องว่างออก
$micro = str_replace(".","",$micro); // ตัดจุดออก
$mysessionname = "po_maint" .
-
session_name($mysessionname);
session_start();
หมายเหตุของโปรแกรม:
ใช้ mysessionname เพื่อส่งตัวแปรสำหรับชื่อเซสชันที่ไม่ซ้ำกันระหว่างเพจ หากคุณใช้ชื่อนี้ คุณต้องทำการเปลี่ยนแปลงเล็กน้อยในโปรแกรมข้างต้น Mysessionname ไม่สามารถเป็นชื่อตัวแปรภายในของเซสชันได้ เนื่องจากมีอยู่แล้วก่อนที่เซสชันจะเริ่มต้น Mysessionname ไม่สามารถจัดเก็บในโหมดคุกกี้ได้ เนื่องจากหลายเซสชันจะเขียนทับไฟล์คุกกี้ต้นฉบับอย่างแน่นอน คุณสามารถบันทึกได้โดยใช้ฟิลด์แบบฟอร์มที่ซ่อนอยู่ แล้วจะไม่มีปัญหา