這篇文章主要介紹了PHP實現提高SESSION響應速度的幾種方法,結合實例形式分析了php操作session的機制與提高session響應速度的常見操作技巧,需要的朋友可以參考下
本文實例講述了PHP實現提高SESSION響應速度的幾種方法。分享給大家供大家參考,具體如下:
設置多級目錄存儲SESSION
默認session的存儲目錄是1級目錄,如果用戶量比較大,session文件數量就比較大,我們可以設置目錄數爲2,使用2級目錄可以提交查找和存取速度。不過這種方式對速度的提升一般不是很明顯,可以通過修改php.ini,進而修改session存儲目錄數。
session.save_path = "2;/tmp"
將SESSION存儲到redis中
php中的session默認是存儲在文件中的,支持redis存儲方式,因爲redis的鍵值數據時存儲在內存中的,可以提高session的存取速度。
session.save_handler = redis session.save_path = "tcp://127.0.0.1:6379"
及時釋放SESSION文件鎖
我們在使用session時,需要先執行session_start()
函數。
session_start()
函數的作用如下:
判斷http請求是否包含名爲PHPSESSID的cookie,如果沒有則創建該cookie並寫入到http響應的頭文件。
通過PHPSESSID查找對應的session文件,以讀寫方式打開的文件,然後讀取裏面的數據到內存。
然後我們一般會通過$_SESSION這個超全局變量,讀取或者設置session的值,我們操作的時候,session的值都是保存在內存中的,默認在頁面執行完畢之後,纔會寫入到對應的文件中。
我們通過下面的一段代碼測試這個過程:
session執行過程分析
include "session_function.php"; //session_function.php代碼在附錄 session_start(); $_SESSION['name']="koastal"; echo "<br/>html content<br/>"; var_dump($_SESSION); echo "<br/>";
輸出結果
open
read
html content
array (size=1)
'name' => string 'koastal' (length=7)
shutdown
write
close
通過上面的例子可以發現,在頁面執行的過程中(頁面的執行過程是指將php文件解析爲對應的html文件的耗時,而不是用戶在該頁面上的停留時間),session文件是被鎖定的。
對於一些耗時的操作,比如文件上傳,發送郵件等,如果用戶在頁面upload.php文件中上傳文件,然後他又打開了個人信息頁面index.php,然而upload.php文件還沒有執行完成,index.php中的session_start()就不能打開對於的session文件,一直等待到upload.php執行完畢。
session死鎖示例程序
upload.php
<?php session_start(); $_SESSION['name']='koastal'; sleep(10); //sleep 10s 模擬文件上傳耗時
index.php
<?php session_start(); var_dump($_SESSION);
通過上面的分析可以知道,session在頁面執行完畢之後,纔會寫入到文件中,並釋放文件鎖。session的功能,我們一般都是在頁面中的一部分用到的,當我們處理完session之後,可以使用session_commit()或者session_write_close()函數,提前將session的值寫入到文件中,並釋放文件鎖。
session_commit過程分析
include "session_function.php"; //session_function.php代碼在附錄 session_start(); $_SESSION['name']="koastal"; session_commit(); echo "<br/>html content<br/>"; var_dump($_SESSION); echo "<br/>";
輸出結果
open
read
write
closehtml content
array (size=1)
'name' => string 'koastal' (length=7)shutdown
我們可以看到,在執行了session_commit()
之後,就提前將session內容寫到文件中,並且關閉文件(釋放文件鎖)了。
死鎖示例優化後程序
upload.php
<?php session_start(); $_SESSION['name']='koastal'; session_commit(); sleep(10); //sleep 10s 模擬文件上傳耗時
我們操作完session之後,先講session數據寫入到文件,然後再執行上傳過程,就不會影響到其他頁面使用該session文件了。
執行完session_commit之後
<?php session_start(); $_SESSION['name'] = "koastal"; session_commit(); echo $_SESSION['name'];
session_commit的另一個名字是session_write_close,也就是將session信息寫入並關閉文件的意思。session_commit之後,雖然session文件已經關閉,但是頁面還在執行,只要沒有執行session_unset內存中就還保存着session的值,所以我們還可以獲取和輸出session的值。其實,這個時候我們還可以給session賦值,但是這個賦值只是賦值到內存中,因爲文件已經關閉,所以其他頁面時訪問不到session_commit();之後設置的session的值。
銷燬session
既然已經探討了這麼多session的問題了,那麼我們在說一下用戶註銷時,銷燬session的操作。
通過上面的分析,我們知道session的值會保存在內存和文件兩個地方。
session_start()
會將對應文件打開,並將session數據讀入到內存。
session_commit()
會將內存中的session數據寫入到文件中,並關閉文件。
不顯示調用session_commit()
的話,會在頁面執行完畢之後,自動調用。
所以,我們需要刪除內存中的session信息,並且刪除session文件。
session_unset(); //刪除內存中的session信息 session_destory(); //刪除session文件
如果我們只是用session_unset();
也能達到註銷用戶的效果,但是這樣處理時間上是把session的數據設置爲空,並且寫入session文件中了,本質上並沒有刪除session文件。
上面的兩部操作,銷燬了服務器上的session值,此外,我們還需要清理保存在客戶端中的cookie,完成真正意義上的註銷操作。
註銷登錄完整代碼
logout.php
<?php session_unset(); //刪除內存中的session信息 session_destory(); //刪除session文件 setcookie('PHPSESSID', null, time()-10);//將cookie值設置爲過期
附錄
session_function.php
<?php function open($save_path, $session_name) { echo __FUNCTION__,"<br/>"; return (true); } function close(){ echo __FUNCTION__,"<br/>"; return (true); } function read($id){ echo __FUNCTION__,"<br/>"; } function write($id, $sess_data){ echo __FUNCTION__,"<br/>"; return (true); } function destroy($id){ echo __FUNCTION__,"<br />"; return(true); } function gc($maxlifetime){ echo __FUNCTION__,"<br />"; return true; } session_set_save_handler("open", "close", "read", "write", "destroy", "gc"); register_shutdown_function('shutdown'); function shutdown() { echo __FUNCTION__,"<br />"; }
更多關於PHP相關內容感興趣的讀者可查看本站專題:《php緩存技術總結》、《PHP數組(Array)操作技巧大全》、《php字符串(string)用法總結》、《PHP錯誤與異常處理方法總結》、《php面向對象程序設計入門教程》、《php+mysql數據庫操作入門教程》及《php常見數據庫操作技巧彙總》
希望本文所述對大家PHP程序設計有所幫助。