【发布时间】:2014-09-17 01:56:56
【问题描述】:
我正在尝试为来自同一浏览器会话的两个近乎同时的请求提供服务。
考虑以下最小示例:
<?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;
}
第二个请求应该导致“锁定”输出,但它总是等待第一个请求完成,然后输出“完成”。
Xdebug 没有运行。 PHP版本是5.5。
编辑:
投票关闭此作为重复。链接的问题建议要解决此问题,请附加一个随机变量。所以我建议附加一个 requestTime 变量并将其设置为以微秒为单位的时间戳。
【问题讨论】:
-
你是如何提出上述要求的?
-
从浏览器中点击脚本。据说这种方法可以用来促进多个 ajax 请求而不会相互阻塞,只要它们没有它。
-
您是否尝试过删除文件 IO(只保留会话启动/关闭睡眠和回显)?
-
@Vatev 文件 IO 是关键的必需部分。
-
在这里找到答案PHP flock() non-blocking still block why?。它解释了问题。解决方法是为每个请求附加一个微时间变量。