2014-09-30 41 views
1

我有一个php脚本,处理并创建大量使用cron作业每5分钟运行的图像。我希望能够限制这一点,以便每次只能运行一次,如果每次运行时间超过5分钟,则不会重叠。PHP - 限制与flock的cron作业重叠()

flock()似乎是实现这一目标的最佳方式,但我很难理解我应该如何将其添加到我现有的脚本中。我的cron作业是安装运行下面的文件 -

images.php:

$array=array("Volvo","BMW","Toyota","Audi","Ford","Alfa","Porsche","Mercedes"); 

foreach ($array as $car) { 
    generateImageCustomFunction($car); 
} 

我想用这样基于示例非阻塞锁:

$fp = fopen('/tmp/lock.txt', 'r+'); 

if(!flock($fp, LOCK_EX | LOCK_NB)) { 
    echo 'Unable to obtain lock'; 
    exit(-1); 
} 

fclose($fp); 

是`lock.txt'只是一个存储/指示锁的纯文本文件,或者是我试图运行的实际文件 - 在这种情况下,images.php

也在哪里我实际上坚持我现有的代码在上面?

+1

这只是一个名为“lock.txt”的文件。当你实际上有或没有文本完全取决于你。文件的仅仅存在性应该足以表明你已经运行了你的脚本。例如'if(file_exists('/ tmp/lock.txt')){die(“Already running”); }' – 2014-09-30 15:29:03

+0

问题是,如果脚本死了,文件在那里运行第二个cron不会运行图像部分,羊群,当脚本死亡解锁imediately – BojanT 2014-09-30 15:37:47

+0

非常抱歉,如果这听起来愚蠢但我不创建lock.txt文件首先,它仅在锁定/运行时创建? – 2014-09-30 15:38:16

回答

1

你的代码放在这里:

$fp = fopen('/tmp/lock.txt', 'w'); 

if(!flock($fp, LOCK_EX | LOCK_NB)) { 
    echo 'Unable to obtain lock'; 
    exit(-1); 
} 

// YOUR CODE HERE  
sleep(5); 

fclose($fp); 

lock.txt只是握着你的锁。您需要对此文件进行写入才能首先创建它。并为您的锁定文件使用一个唯一的名称,所以它不会干扰其他进程。