5

假设我们需要一些锁定脚本,以确保两个脚本永远不会同时运行:

if(file_get_contents('test.txt')) { // this is always empty...
   die("Another script is running in background!");
}
file_put_contents('test.txt', 'busy!');
sleep(10); // heavy work here
file_put_contents('test.txt', '');

它仍然允许我同时运行两个脚本。看起来结果file_get_contents()被缓存了?

如何解决?我想使用文件,而不是数据库。


编辑:我已经设法使用flock()完成了锁定脚本(感谢Levi Morrison)

无论如何,我仍然很好奇为什么file_get_contents会以如此意想不到的行为工作?

4

1 回答 1

2

我能够重现它并找出问题所在。起初它看起来像你描述的那样:我在浏览器中请求了脚本,并且在它运行时我检查了文件内容 - 它是busy!. 然后我运行第二个脚本,在浏览器中它也在加载,与第一个相同。我以为它也在运行,但事实并非如此

很容易计算,如果不是busy!随机添加一些东西,例如:

file_put_contents('test.txt', 'busy washing ' . (mt_rand(1, 999) * 99999) . ' dishes');

以相同的方式运行相同的两个脚本并监视文件内容。起初,这将是第一个脚本编写的内容。说busy washing 1 dishes。然后你会看到内容变成了第二个脚本写的内容,数量会有所不同。

基本上,发生的情况是第二个脚本等待第一个脚本完成,然后才开始。有趣的是,通过完成,第一个脚本清除了文件,这让第二个脚本正常运行,但在浏览器中看起来它们都在同时工作。事实上,第二个脚本运行的时间是第一个脚本的两倍。

我在通过 AJAX 执行大量异步请求并在另一个浏览器选项卡中请求相同的网站页面时遇到了这种行为。在脚本完成之前,我无法加载选项卡。

长话短说,没有问题!如果您通过 cron 将这些脚本排队,它们将单独运行,第二个将通过发现文件不为空来完成。

于 2012-12-19T19:23:18.400 回答