【问题标题】:php script will only run one at a timephp 脚本一次只能运行一个
【发布时间】: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


【解决方案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);

为我工作。尝试添加第三个参数


编辑: 您可能会遇到一些会话锁定问题: 当您调用 session_start() 时,它将阻止(将进一步的请求置于等待状态)对您的脚本的任何其他请求,直到启动会话的原始脚本完成。要对此进行测试,请尝试使用 2 个不同的浏览器进行访问,或者避免在此脚本中调用 session_start()。

【讨论】:

  • 我的原始代码对您有用吗? (我稍后回家时会测试这个解决方案)。我正在尝试查看是否存在可能将其弄乱的服务器设置,因为我看到的所有示例都是按照我的方式进行的。
  • 是的,原来的代码好像也可以用(加了sleep之后就可以测试了)。不过,您可能会遇到一些会话问题。访问那个页面,你用的是同一个浏览器吗?
  • 是的,我使用相同的浏览器。问题:如果您将睡眠设置为 20 秒并运行脚本,那么第二个是否真的同时显示消息?你看我的第一个脚本会运行很长时间。感谢您一直以来的帮助!
  • 是的。这就是我定义“它的工作原理”的方式:) 我说过你可能有会话问题,因为当你调用 session_start() 时,它会阻止(将它们置于等待状态)对你的脚本的任何其他请求,直到原始脚本开始会话已经结束。要对此进行测试,请尝试使用 2 个不同的浏览器进行访问,或者避免在此脚本中调用 session_start()
  • 这是一个非常好的观点!一开始我什至没有想到会议开始!我实际上并没有在这个脚本上使用会话,所以不需要它!您能否将其添加到您的主要帖子中,我会标记答案。谢谢!
猜你喜欢
  • 1970-01-01
  • 2022-10-16
  • 2018-01-30
  • 2011-02-26
  • 1970-01-01
  • 1970-01-01
  • 2021-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多