【发布时间】:2016-12-31 20:08:02
【问题描述】:
编辑:我的问题来自 Firefox 的“智能”行为。如果您在两个不同的选项卡上调用同一页面,它会在第一个完成后自动启动第二个。如果要并行执行,则必须添加不同的参数。
正在尝试使用目录创建互斥锁。例如:
$dir = 'test' ;
echo is_dir($dir) ;
mkdir($dir)
wait(30)
rmdir($dir)
在浏览器中,我调用脚本,几秒钟后在另一个选项卡上调用相同的脚本。
is_dir 返回 false,第二次调用时 mkdir 没有错误 在磁盘上,目录是使用第一个脚本创建的,并一直保留到第二个结束。
如果我在命令行上一个接一个地调用这两个脚本,我就有了
预期结果 is_dir 为 true,mk_dir failed with dir already exists 错误。
Web 服务器是 apache2。
无法解释这种行为。
【问题讨论】:
-
坦率地说,我不知道你的问题是什么,但要点让我觉得你被统计缓存抓住了? php.net/manual/en/function.clearstatcache.php
-
这在我看来像是一个 XY 问题:为什么你认为你需要在 PHP 中模拟互斥锁?请求周期就是这样,PHP 是无状态的,2 个并发请求实际上并不共享状态(就您编写的 PHP 代码而言)。互斥锁的存在是为了防止竞争条件和对多个线程共享的内存(状态)的并发访问。除非您尝试做一些非常奇怪的事情,否则 PHP 根本不需要它们,这就是 PHP 没有内置功能的原因
-
@JonStirling:您可能说得对,可以通过解释 PHP 如何在内部处理实际 IO 操作(缓冲 IO 和缓存系统调用)来回答 OP 的问题。但是,我认为 OP 应该问的真正问题是 为什么 他试图在 PHP 中创建目录作为某种互斥系统
-
@Ootegem 脚本作为缓存工作,我们调用 Web 服务器来获取文件并避免每次缓存文件时调用该站点。每小时它都会将最新版本与新版本进行比较,并在修改后更改它,并为调用者提供本地文件。因此,每次脚本需要文件时都不会调用缓存服务器。今天服务器停止响应,因此在每次调用时,由于超时延迟,脚本都会搜索创建大量 tcp 调用的新文件。因此,当一个脚本尝试访问文件服务器时,我试图阻止后续调用。
-
@Régis:所以它是一种缓存机制,而不是互斥体。请不要称它为互斥体,因为这让我想到了各种可怕的事情......
标签: php