【问题标题】:Using flock() in crontab在 crontab 中使用flock()
【发布时间】:2014-05-23 01:54:52
【问题描述】:

我正在使用一个执行 PHP 文件的 crontab。我想实现flock() 命令来帮助防止重复的crontabs 一次运行。如果我有:

* * * * * php /var/www/html/welcome.php

如何添加这个flock() 命令?谢谢!

【问题讨论】:

    标签: php linux flock


    【解决方案1】:

    试试这个:

    $fh = fopen('mutex.txt','r');  // Any convenient file (MUTual EXclusion)
    flock($fh, LOCK_EX);       // get exclusive lock. Will block until lock is acquired
    
    // Do your exclusive stuff...
    
    flock($fh, LOCK_UN);      // release lock
    fclose($fh);              // close Mutex file.
    

    【讨论】:

    • 感谢您的回复!现在这是在我的welcome.php 文件中吗?
    • 您好,感谢您的回答。但是我必须添加'r',例如: $fh = fopen('mutex.txt', 'r');因为我得到了: fopen() 至少需要 2 个参数,给定 1 个是正常的吗?但是它的工作很棒我尝试启动几秒钟的php(cli)并且脚本没有按预期执行(等待)。
    【解决方案2】:

    为了完成你的答案,并且你每分钟都使用一个 crontab,你可能会遇到一个问题:

    如果出于任何原因,您的脚本未能在 1 分钟内完成他的工作,或者脚本在某处失败并且没有移除锁定(卡在“while”内...),下一个 crontab 将启动并停留在您的进程列表直到前一个解除他的锁,以此类推...

    更好的方法是:

    $fh = fopen('/path/to/mutex.txt', 'r');  //Any convenient file (MUTual EXclusion)
    
      if(!flock($fh, LOCK_EX | LOCK_NB)) //Exit if lock still active
       exit(-1);
    
       //Your code here
    
      flock($fh, LOCK_UN);      //release lock
      fclose($fh);              //close Mutex file.
    

    这将避免任何堆栈的进程 php

    【讨论】:

      猜你喜欢
      • 2020-03-20
      • 2013-06-03
      • 2013-07-30
      • 1970-01-01
      • 2015-03-29
      • 2019-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多