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()"> <p id="result"></p> <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 執行並記錄執行到第幾步
<?php session_start(); $_SESSION['step'] = ''; $n = 1; while($n<=10){ $_SESSION['step'] = $n; sleep(1); $n++; } $_SESSION['step'] = 'complete'; ?>
#getstep.php 取得執行到第幾步#
<?php session_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 按以下修改,就能取得到執行到哪一步
<?php session_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'; ?>
以上是關於php session 讀寫鎖定的相關內容的詳細內容。更多資訊請關注PHP中文網其他相關文章!