2012年1月2日 星期一

PHP session lock (頁面阻塞)

使用session時,若頁面尚未執行完畢,預設session會被鎖住。
此時,若另外開一個也有使用session的頁面,
則須等前一個頁面執行完畢,才能再執行。
也就是有執行 session_start() 的頁面,若前一個頁面尚未執行完畢,繼續執行的其他頁面會被阻塞住。

要避免等前一個頁面執行完畢,才能執行下一個頁面的情況,
可以使用 session_write_close() ,表示不會對 session 做寫入的動作,
這樣其他頁面就不會等此頁面執行完才能再執行,便可達成非阻塞操作。

範例:沒使用 session_write_close()
a.php程式碼如下
//a.php
session_start();
sleep(15);
echo "end";
b.php程式碼如下
//b.php
session_start();
echo "end";

執行結果如下,左圖(a.php)尚未執行完畢,則右圖(b.php)須等a.php執行完才能執行。


範例:使用 session_write_close()
a.php程式碼如下
//a.php
session_start();
session_write_close();//加上session_write_close
sleep(15);
echo "end";
b.php程式碼如下
//b.php
session_start();
echo "end";

執行結果如下,左圖(a.php)尚未執行完畢,右圖(b.php)不須等a.php執行完亦可執行。


註:若執行 session_write_close() 後,又想對 session 有寫入的操作,只須再執行 session_start(),即可改回可對 session 寫入的阻塞操作模式。

其他:

沒有留言:

張貼留言