假设我们需要一些锁定脚本,我们确保两个脚本永远不会同时运行:
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', '');
Run Code Online (Sandbox Code Playgroud)
它仍然允许我同时运行两个脚本.看起来像file_get_contents()缓存的结果?
怎么解决?我想使用文件,而不是DB.
编辑:我已经设法使用flock()设置了锁定脚本(感谢Levi Morrison)
无论如何,我仍然很好奇为什么会file_get_contents出现如此意外的行为?
我能够重现它并找出问题所在。起初,它看起来像您描述的那样:我在浏览器中请求了脚本,在它运行时我检查了文件内容 - 它是busy!. 然后我运行第二个脚本,在浏览器中它也正在加载,与第一个脚本相同。我以为它也在运行,但事实并非如此。
busy!如果你不添加随机的东西,那么这很容易计算,例如:
file_put_contents('test.txt', 'busy washing ' . (mt_rand(1, 999) * 99999) . ' dishes');
Run Code Online (Sandbox Code Playgroud)
以相同的方式运行相同的两个脚本并监视文件内容。首先,这将是第一个脚本所写的内容。说busy washing 1 dishes。然后你会看到内容变成了第二个脚本所写的内容,数字会不同。
基本上,发生的情况是第二个脚本等待,而第一个脚本完成然后才开始。有趣的是,完成后,第一个脚本会清除文件,这让第二个脚本正常运行,但在浏览器中看起来它们就像同时工作一样。事实上,第二个脚本的运行时间是第一个脚本的两倍。
我在通过 AJAX 执行大量异步请求并在另一个浏览器选项卡中请求相同的网站页面时遇到过这种行为。在脚本完成之前我无法加载该选项卡。
长话短说,没有问题!如果您通过 cron 对这些脚本进行排队,它们将单独运行,第二个脚本将通过发现文件不为空来完成。