【发布时间】:2011-02-23 19:04:58
【问题描述】:
我有一个脚本,我想确保只有一个正在运行,我正在做:
$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。似乎第二个文件甚至都不会运行......我应该担心吗?
【问题讨论】:
-
您是否偶然在 Windows 上运行此程序?根据flock 文档,看起来Windows 不支持No Blocking 标志。
-
不,我在 Linux VPS 上运行它。我认为它正在运行 Centos,尽管我不记得了。另外,我认为这个问题更多地与第二个脚本实际上不会第二次运行的事实有关 - 与我的编辑一致。
标签: php