PHP中session詳解2
綜述
Session指的就是用戶在瀏覽某個網站時,從進入網站到瀏覽器關閉所經過的這段時間,也就是用戶瀏覽這個網站所花費的時間。從上述的定義中我們可以看到,Session其實是一個特定的時間概念。
一般來說,在網站上某一個頁面中的變數(指伺服器端變量,下同)是不能在下一頁中用的,有了session就好辦了。 session中註冊的變數可以當作全域變數使用。這樣我們就可以將session用於使用者身分認證,程式狀態記錄,頁面之間參數傳遞。
在PHP3版本中是如何實現session的?
php3本身是沒有實作session功能的,我們只有用其他的方法來實現,這其中最有名的要算phplib了。 phplib最基本的功能包括使用者認證、Session管理、權限及資料庫的抽象化。下面我們就來講述一下如何用phplib實作session。
1、先安裝phplib(環境為win2000+php3.0.16+Apache1.3.12+phplib7.2c+mysql3.23.21 for win32)
到Apache的安裝目錄下。例如:Apache安裝在d:Apache 目錄下,那麼就將"php"目錄拷貝到d:Apache,並將phplib目錄的pages目錄下(不包括目錄本身)的檔案和目錄一起拷貝到d:Apachehtdocs下。
phplib的類別庫需要根據系統進行初始化,可能需要修改local.inc檔,其中包含著一些基本參數,可以根據自己機器的實際情況來進行修改。
將d:Apachephpprepend.php檔案中的一段程式改為如下樣子:
if (!isset($_PHPLIB) or !is_array($_PHPLIB)) { $_PHPLIB["libdir"] = "d:/Apache/php/"; //放phplib下php目录的路径 } 修改d:\Apache\php\local.inc文件: class DB_Example extends DB_Sql { var $Host = "localhost"; //mysql数据库所在主机名 var $Database = "test"; //数据库名 var $User = "root"; //数据库用户名 var $Password = "1234567"; //数据库用户密码 }
最後根據phplib目錄下的stuff子目錄中的create_database.mysql檔產生初始表。
由於每一個使用phplib的頁面首先必須可以找到運行phplib所必需的類庫文件,我們可以在php.ini中設置auto_prepend變量來支援,phplib中包含一個prepend.php文件,並將auto_prepend指定為"d :/Apache/php/prepend.php"(帶引號)後,各頁就會自動包含phplib類別庫,我們也可以將phplib類別庫所在目錄加進include變數中,以便可以找到這些檔案。
2、呼叫page_open()函數
在每一個使用phplib的頁面中,必須先呼叫page_open函數進行初始化,例如:
<?php page_open(array("sess" => "Test_Session")); ?>
數組變數(sess)用這裡初始化一些狀態保存物件,這裡應該注意:必須使用phplib內建名(sess),這些內建名是在local.inc中所定義的.。
因為phplib使用了Cookies來保存狀態資訊,所以page_open()函數必須在頁面內容輸出到瀏覽器之前被呼叫。 php腳本最後應以page_close()結束,這將會將有關狀態資料寫回資料庫,否則變數會遺失。
3、具體使用。
註冊一個變數後即可在隨後的頁面中使用它,直到session結束。方法:
<?php $sess->register( "varname"); ?>
注意,這裡的varname不是變數值,而是變數名,可以先指定變數名,然後再賦值。你在某個頁面中可以改變變數的值,隨後的頁面訪問該變數時會得到改變後的值。變數的型別是多樣的,可以是一個字串,一個數字,一個陣列。舉例說明:
第一頁:
<?php
page_open(array("sess" => "Test _Session"); ; //註冊變數$welcome,注意不需要加上$
$welcome="Hello,PHP world!";
…
page_close();
page_close();
<?php
page_open();//開始session
echo $welcome; //顯示第一頁定義的$welcome
page_close();//儲存狀態資訊
?>
註冊完一個變數,當頁面被寫入最後一個變數。如果忘記呼叫page_close()函數的話,變數就不會被寫回資料庫,這樣將出現不可預測的後果。當變數被使用完畢,不再需要用到時,可以調用以下函數將變數刪除:
<?php page_open(array("sess" => "Test _Session")); …… $sess->unregister( "variable_name"); …… page_close(); ?>
在PHP4版本中是如何实现session的?
php4的session也靠cookies保存session id,用文件系统保存变量(默认情况下),因此,它的session变量不能保存对象。当然也可以将session保存在数据库中。
在php4中有关session的函数很多(详见php.ini配置一文),通常情况下我们只需要调用三个函数即可:sesssion_start()、session_register()、session_is_registered()。
在需要用到session的每一页的最开始处调用session_start()函数, 例如:
<?session_start()?>
<html><body>
<?
$welcome="hello world !";
session_register("welcome");//注册$welcome变量,注意没有$符号
if(session_is_registered("welcome"))//检查$welcome变量是否注册
echo "welcome变量已经注册了!";
else
echo "welcome变量还没有注册!";
?>
</body></html>
php4中session处理的定制
我们需要扩充6个函数:
sess_open($sess_path, $session_name);
这个函数被session处理程序调用来作初始化工作。
参数$sess_path对应php.ini文件中的session.save_path选项
参数$session_name对应php.ini中的session.name 选项。
sess_close();
这个函数在页面结束执行并且session处理程序需要关闭时被调用
sess_read($key);
这个函数在session处理程序读取指定session键值($key)时,检索并返回标识为$key的session数据.(注意:序列化是将变量或对象在程序结束或需要时保存在文件中,在下次程序运行或需要时再调入内存的技术,有别于只保存数据的方法。)
sess_write($key, $val);
这个函数据在session处理程序需要将数据保存时调用,这种情况经常在程序结束时发生。它负责将数据保存在下次能用sess_read($key)函数检索的地方。
sess_destroy($key);
这个函数在需要消毁session时。它负责删除session并且清除环境。
sess_gc($maxlifetime);
这个函数负责清理碎片。在这种情况下,它负责删除过时的session数据。session处理程序会偶尔调用它们。
定制程序可以用mysql数据库或DBM文件保存session数据,视具体的情况而定。如果使用mysql作支持,那还需要进行以下的步骤:
首先在mysql中创建一个sessions数据库,并且创建一个sessions表:
mysql> CREATE DATABASE sessions;
mysql> GRANT select, insert, update, delete ON sessions.* TO phpsession@localhost
-> IDENTIFIED BY 'phpsession';
mysql> CREATE TABLE sessions (
-> sesskey char(32) not null,
-> expiry int(11) unsigned not null,
-> value text not null,
-> PRIMARY KEY (sesskey)
-> );
下一步,修改session_mysql.php文件的$SESS_DB* 变量使其匹配你机器上的数据库设置:
<?
$SESS_DBHOST = "localhost"; /* 数据库主机名 */
$SESS_DBNAME = "sessions"; /* 数据库名 */
$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");
?>
session定制的测试代码:
<?php
……
if ($handler == "dbm") include("session_dbm.php");//使用何种接口
elseif ($handler == "mysql") include("session_mysql.php");
else ……
session_start();
session_register("count");
……
?>
在身分驗證中,如何應用Session?
Session可用於使用者認證:
驗證使用者是否合法:
<?
〠/驗證過程中; session_register("reguser");
?>
在另一頁中檢查使用者是否登入
<?
session_start();
if(isset($user)&&$ user=""){/歡迎你如果已經愛的;
}else{//如果沒有登入
echo "請先註冊!";
}
『 session_destroy();
……
?>
如何實現多session並發運作?
問題提出:我在為所在單位編寫一個進銷存系統中發現需要讓多個使用者可以同時進入一個php應用程式。原來設計的靜態的唯一的session ID導致資料混亂。這樣,動態產生一個唯一的session ID成為當務之急。
解決方法很簡單:我用了php檔案名稱+時間戳為唯一的session ID,這樣在我的程式中的每個session就各就各位,不再混亂了。
下面把我的原始碼公佈,方便也有同樣的問題的朋友多一個解決方法。
//Start a PHP session to preserve variables.
if ( empty($mysessionname) ) {
$micro = microtime(); out the blanks
$micro = str_replace(".","",$micro); // strip out the periods
〔$po_ "po_int" . mysessionname);
session_start();
程式註:
用mysessionname為頁間唯一的sessionname傳遞變量,如果你也用到這個名字必須把上述程式做個小小的改動。 Mysessionname不能為session的內部變數名,因為他在session開始之前就已經存在了。 Mysessionname也不能用cookie方式存放,因為多個session一定會覆寫原來的cookie檔。你可以用隱含表單的網域來保存它。這樣就不會出問題。
更多PHP中session使用方法詳解第2/2頁相關文章請關注PHP中文網!

PHPSession跨域与跨站请求伪造的对比分析随着互联网的发展,Web应用程序的安全性显得格外重要。在开发Web应用程序时,PHPSession是一种常用的身份验证和会话跟踪机制,而跨域请求和跨站请求伪造(CSRF)则是两种主要的安全威胁。为了保护用户数据和应用程序的安全性,开发人员需要了解Session跨域和CSRF的区别,并采

Memcached是一种常用的缓存技术,它可以使Web应用程序的性能得到很大的提升。在PHP中,常用的Session处理方式是将Session文件存放在服务器的硬盘上。但是,这种方式并不是最优的,因为服务器的硬盘会成为性能瓶颈之一。而使用Memcached缓存技术可以对PHP中的Session处理进行优化,提高Web应用程序的性能。PHP中的Session处

解决PHPSession跨域问题的最佳实践随着互联网的发展,前后端分离的开发模式越来越普遍。在这种模式下,前端与后端可能部署在不同的域名下,这就导致了跨域问题的出现。而在使用PHP的过程中,跨域问题也涉及到Session的传递与管理。本文将介绍PHP中解决Session跨域问题的最佳实践,并提供具体的代码示例。使用Cookie使用Coo

PHPSession跨域错误日志处理在开发Web应用程序时,我们经常会使用PHP的Session功能来跟踪用户的状态。然而,在某些情况下,会出现跨域的错误,导致无法正确访问和操作Session数据。本文将介绍如何处理PHPSession跨域错误,并提供具体的代码示例。什么是PHPSession跨域错误?跨域错误指的是在浏览器中

PHPSession跨域的安全审计与漏洞挖掘摘要:随着互联网的发展,越来越多的网站开始使用PHPSession来管理用户的登录状态和数据。然而,由于PHPSession的特性,使得它存在一些安全风险,尤其是在跨域访问的情况下。本文将介绍PHPSession跨域安全审计的重要性,并提供一些具体的漏洞挖掘代码示例。一、引言PHPSession是一种在

PHPSession跨域与跨站脚本攻击的关系随着网络应用的广泛应用,安全性问题也日益引起人们的关注。在开发网络应用时,处理用户会话(Session)是非常常见的一个需求。而PHP提供了一种方便的会话管理机制——Session。但是,Session也存在一些安全问题,特别是与跨域和跨站脚本攻击相关的问题。跨域攻击(Cross-Domain)是指通过一种网站

PHPSession跨域与数据压缩传输的性能对比引言:在Web开发中,PHPSession是一种常用的跨页面和跨请求的数据传输方式。然而,当我们面对大量数据传输或跨域问题时,我们需要考虑性能和效率的问题。本文将探讨PHPSession跨域与数据压缩传输的性能对比,并给出具体的代码示例。跨域传输在跨域传输时,常见的方法是使用Cookies或隐藏表单

PHPSession跨域与跨站点存储的关联,需要具体代码示例近年来,随着互联网的迅速发展,跨域与跨站点存储在开发中变得越来越重要。在PHP开发中,使用Session来存储用户的会话数据是一种常见的方式。本文将重点介绍PHPSession的跨域和跨站点存储,并提供一些具体的代码示例。一、PHPSession简介PHPSession是一种用于在不同页面


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Dreamweaver CS6
視覺化網頁開發工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),