我有一个脚本,我想确保只有一个正在运行,我正在做:
$fp = fopen("lock.txt", "w");
if (flock($fp, LOCK_EX|LOCK_NB)) { // do an exclusive lock
//Processing code
flock($fp, LOCK_UN);
}else{
echo "Could not lock file!";
}
fclose($fp);
问题是当我启动第二个脚本时,它只是在那里等待。如果我然后停止第一个脚本,则第二个脚本将打印“无法锁定此文件”。为什么第二个脚本不会立即停止并报告该消息?
如果它运行第二个脚本,它将知道该文件已被锁定并应退出。当我观察我的过程时,我可以看到第二个脚本坐在那里......它只是在等待。
感谢。
编辑:我刚刚尝试了一个快速而脏的数据库锁,即将运行字段设置为-1并在脚本打开时检查它。但这不起作用。我也尝试过使用套接字:here。似乎第二个文件甚至不会运行......我是否应该担心?答案 0 :(得分:1)
$fp = fopen("lock.txt", "w");
$block = 0;
if (flock($fp, LOCK_EX|LOCK_NB, $block)) { // do an exclusive lock
sleep(5);
flock($fp, LOCK_UN);
echo "Could lock file!";
}else{
echo "Could not lock file!";
}
fclose($fp);
适合我。尝试添加第3个参数
编辑: 您可能遇到一些会话锁定问题: 当您调用session_start()时,它将阻止(将其他请求置于等待状态)对脚本的任何其他请求,直到启动会话的原始脚本完成为止。要对此进行测试,请尝试使用2个不同的浏览器进行访问,或者避免在此脚本中调用session_start()。