php session 读写锁
先看一个例子,功能:
1.点击页面中一个按钮,ajax执行php,php中用session记录执行到哪一步。
2.使用ajax轮询另一个php,获取session中数据,输出执行到哪一步。
session.html 调用php执行,并输出执行到第几步
session lockfunction handle(){
$.get("handle.php"); // 执行handle
// 每500毫秒请求,获取执行到第几步
var et = setInterval(function(){
$.get("getstep.php",
function(data){
$('#result').html('当前执行:' + data + '
');
if(data=='complete'){
clearInterval(et);
}
}
);
},500);
}
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中文网。
相关推荐: