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,这本质上是我说“好的,我已经从这个会话文件中得到了我想要的,这个请求不需要再写入它或读取它”。好的,明白了。你的期望是正确的。需要对此进行调查。