连续运行Cron作业

时间:2015-09-21 16:36:39

标签: php cron

对不起,如果之前已经问过这个问题,但是在搜索时找不到任何相关内容。

我目前有一个PHP脚本,它会轮询数据库以查找尚未更新的下一条记录。我的问题是这样的:如果我然后更新数据库以显示在cron作业运行时记录正在处理(大约需要30秒),并且cron作业设置为每秒运行一次,则在第二个1运行cron作业,但这个工作会在cron作业第二次运行之前等待完成,还是会在第二次运行?

由于

3 个答案:

答案 0 :(得分:1)

如果你在php脚本中使用cronjob并且没有使用任何类型的锁定,那么如果时间事件发生在最后一个脚本完成之前,cron将运行多个脚本副本。

为避免此类问题,您可以执行以下操作:

$LOCK_FN = "/tmp/my-script.lock"
if(file_exists ($LOCK_FN)){
    //previous script is not finish exit.
    die("Previous script is not finished yet.");
}
//Create lock
$fp = fopen($LOCK_FN,"w");
fclose($fp);

/*

 Put your script logic here
 */

//Open the lock work is done.
unlink($LOCK_FN)

答案 1 :(得分:1)

使用套接字来锁定某些东西。因为如果脚本被终止,套接字端口将自动再次打开。

<?php
$port = 1080; // choose unused port
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!$sock) {
    exit;
}
socket_set_nonblock($sock);
if (!socket_bind($sock, "127.0.0.1", $port)) {
    exit;
}

while(1) { ... }
?>

每个脚本使用不同的端口。

使用* * * * *

将此脚本添加到Crontab

答案 2 :(得分:0)

在启动新实例之前,cronjob不会等待前一个完成。您想要的是一个守护进程,请参阅Run php script as daemon process