PHP会话被阻塞,忽略会话\u写入\u关闭
我试图为来自同一浏览器会话的两个几乎同时发生的请求提供服务 考虑以下最小示例:PHP会话被阻塞,忽略会话\u写入\u关闭,php,session,Php,Session,我试图为来自同一浏览器会话的两个几乎同时发生的请求提供服务 考虑以下最小示例: <?php session_start(); $sessionId = session_id(); session_write_close(); $file = sys_get_temp_dir() . '/lock_test'; if (!file_exists($file)) { touch($file); sleep(5); unlink($file);
<?php
session_start();
$sessionId = session_id();
session_write_close();
$file = sys_get_temp_dir() . '/lock_test';
if (!file_exists($file)) {
touch($file);
sleep(5);
unlink($file);
echo 'done! ' . $sessionId;
} else {
echo 'locked! ' . $sessionId;
}
此行为正常。如果两个请求共享同一个会话,并且您正在使用文件存储会话数据,PHP需要flock()
会话文件,以防止它被多个并发请求损坏,这些请求将试图写入该文件。(当然PHP总是flock()
会话文件,但是如果有多个共享同一会话的并发请求,您可以看到它的效果)您是如何发出上述请求的?从浏览器中点击脚本。据推测,这种方法可以用于促进多个ajax请求,而不会像没有它时那样彼此阻塞。您是否尝试过删除文件IO(只保留会话启动/关闭睡眠和回显)?@Vatev文件IO是关键的、必需的部分。在这里找到了答案。它解释了这个问题。解决方法是在每个请求中附加一个微时间变量。但是我显式地调用session_write_close,这本质上是我说“好的,我已经从这个会话文件中得到了我想要的,这个请求不需要再写入它或读取它”。好的,明白了。你的期望是正确的。需要对此进行调查。