file_get_contents似乎是缓存,锁定脚本问题

时间:2012-12-19 16:17:30

标签: php locking

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

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()的结果被缓存了吗?

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


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

无论如何,我仍然很好奇为什么file_get_contents会出现如此意外的行为?

1 个答案:

答案 0 :(得分:2)

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

很容易想象,如果不是busy!而是添加随机内容,例如:

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

以相同的方式运行相同的两个脚本并监视文件内容。首先,它将是第一个脚本写的。说busy washing 1 dishes。然后,您将看到内容更改为第二个脚本写入的内容,数字将不同。

基本上,发生的是第二个脚本等待,而第一个脚本完成后才会启动。有趣的是,通过完成,第一个脚本清除文件,这让第二个脚本正常运行,但它在浏览器中看起来就像它们同时工作一样。实际上,第二个脚本的运行时间是第一个脚本的两倍。

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

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