php session阻塞頁面分析及優化 (session_write_close session_commit使用)


轉: 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也不是壞事,養成習慣后。可以節省性能,減少服務器開銷。是個不錯選擇!歡迎大家交流!
*
/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM