php脚本一次只能运行一个

时间:2011-02-22 23:56:17

标签: php

我有一个脚本,我想确保只有一个正在运行,我正在做:

$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。似乎第二个文件甚至不会运行......我是否应该担心?

1 个答案:

答案 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()。