Welcome 微信登录

首页 / 网页编程 / PHP / php的session读写锁例子

php的session读写锁例子2014-08-31先看一个例子,功能:

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";?>