php session 讀寫鎖
先看一個例子,功能:
1.點擊頁面中一個按鈕,ajax執行php,php中用session記錄執行到哪一步。
2.使用ajax輪詢另一個php,擷取session中資料,輸出執行到哪一步。
session.html 調用php執行,並輸出執行到第幾步
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <script src="//code.jquery.com/jquery-1.11.0.min.js"></script> <title> session lock </title> </head> <body> <input type="button" value="handle" onclick="handle()"> <div id="result"></div> <script type="text/javascript"> function handle(){ $.get("handle.php"); // 執行handle // 每500毫秒請求,擷取執行到第幾步 var et = setInterval(function(){ $.get("getstep.php", function(data){ $('#result').html('當前執行:' + data + '<br>'); if(data=='complete'){ clearInterval(et); } } ); },500); } </script> </body></html>
handle.php 執行並記錄執行到第幾步
<?phpsession_start();$_SESSION['step'] = '';$n = 1;while($n<=10){ $_SESSION['step'] = $n; sleep(1); $n++;}$_SESSION['step'] = 'complete';?>
getstep.php 擷取執行到第幾步
<?phpsession_start();echo isset($_SESSION['step'])? $_SESSION['step'] : '';?>
執行時發現,並不是每一步返回,而是等待10秒後直接返回complete。
當執行session_start()後,session會被鎖住。直到頁面執行完成。
因此在頁面執行其間,對sesssion進行寫操作,只會儲存在記憶體中,並不會寫入session檔案。
而對session進行讀取,則需要等待,直到session鎖解開才能讀取到。
我們可以使用session_write_close()把資料寫入session檔案並結束session進程。這樣就不需要等待頁面執行完成,也能擷取到執行到哪一步。
但這樣有個問題,就是執行完sesssion_write_close()後,對session的任何寫操作都不起作用。因為session進程已經結束。
因此需要再寫session時,在前面加上session_start()
session_start — Start new or resume existing session
session_write_close — Write session data and end session
handle.php 按以下修改,就能擷取到執行到哪一步
<?phpsession_start();$_SESSION['step'] = '';$n = 1;while($n<=10){ $_SESSION['step'] = $n; session_write_close(); // 將資料寫入session檔案,並結束session進程 session_start(); // 重新建立session進程 sleep(1); $n++;}$_SESSION['step'] = 'complete';?>