PHP-限制cron作业与flock()重叠

PHP-限制cron作业与flock()重叠,php,cron,flock,Php,Cron,Flock,我有一个php脚本,它可以处理和创建大量图像,使用cron job每5分钟运行一次。我希望能够限制这一点,这样它一次只能运行一次,如果每次运行时间超过5分钟,则不会重叠 flock()。我的cron作业已设置为运行以下文件- images.php: $array=array("Volvo","BMW","Toyota","Audi","Ford","Alfa","Porsche","Mercedes"); foreach ($array as $car) { generateImageC

我有一个php脚本,它可以处理和创建大量图像,使用cron job每5分钟运行一次。我希望能够限制这一点,这样它一次只能运行一次,如果每次运行时间超过5分钟,则不会重叠

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

另外,我在上面的代码中实际粘贴的位置是什么?

您的代码在这里:

$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
只会锁住你的锁。您首先需要对该文件具有写访问权限才能创建它。并为锁定文件使用唯一的名称,这样它就不会干扰其他进程。

它只是一个名为“lock.txt”的文件。你到底有没有文本完全取决于你自己。仅仅文件的存在就足以表明您已经运行了脚本。e、 g.
if(file_exists('/tmp/lock.txt'){die(“已经在运行”)}
问题是,如果脚本死了,文件就在那里,所以运行第二个cron不会运行图像部分flock,当脚本死了,立即解锁imediatelyso抱歉,如果这听起来很愚蠢,但我没有创建lock.txt文件开始,它只在被锁定/运行时创建?只需创建一个文件
touch/tmp/lock.txt
它可以是空的,并用“w”代替“r”@BojanT在这里有一个很好的观点。因此,可能有另一个脚本/cron来检查锁文件的年龄,如果早于X,则删除锁文件。如果您知道脚本的运行时间从不超过30分钟,请检查锁定文件是否超过30分钟,如果超过30分钟,请将其删除。这假定原始脚本失败,这就是文件仍然存在的原因。