轉: http://www.tuicool.com/articles/bqeeey
首先看下下面代碼, session1.php 文件
<?php ini_set('session.save_path', './tmp/'); 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('test'); function test() { echo __FUNCTION__,"<br />"; } session_start(); echo 'aaaaa',"<br />"; /* 結論->session_start開啟后, 會自動執行open,read函數。 等頁面執行完后,會執行shutdown函數.最后后會把session寫入進去,然后執行close關閉文件 從session_start 到頁面結束,會一直鎖定文件或者保持連接的。 */
然后通過1個實例子來理解 , 先執行 session2.php 代碼, 20秒內執行 session3.php
session2.php 文件
<?php //執行 session2.php和session3.php, /* 因為 session2.php 腳本一直沒有結束,結束后 session才會執行寫入和關閉操作 (看session1.php 結論), session一直被鎖定了 因此執行session3.php 時會發現 一直處於阻塞狀態。 */ /* session_start(); $_SESSION['uname'] = 'lily'; sleep(20); */ //如果用以下代碼 就沒問題了, 立即提交 寫入關閉 session_start(); $_SESSION['uname'] = 'lemon'; session_commit(); sleep(20);
session3.php 文件
<?php session_start(); echo $_SESSION['uname'];
總結:
//可以用 session_commit (別名 session_write_close) 立即執行寫入關閉 /* session_start(); $_SESSION['aaaa'] = 1000; session_commit(); //執行commit后,直接會調用,wirte,close操作 */ /* 1.只讀取session頁面,建議打開后,就直接commit,這是$_SESSION變量已經生成了。 2.有對session進行寫入頁面,建議修改完$_SESSION后,直接調用commit 3.多次打開並且寫入,這個不建議使用,比較打開文件,寫入都是耗費時間的。如果能一次搞定的,就不要做多次了。 除非,中間執行很耗時的業務。 后記:其實,使用完session,隨手commit也不是壞事,養成習慣后。可以節省性能,減少服務器開銷。是個不錯選擇!歡迎大家交流! * /
