对不起,如果之前已经问过这个问题,但是在搜索时找不到任何相关内容。
我目前有一个PHP脚本,它会轮询数据库以查找尚未更新的下一条记录。我的问题是这样的:如果我然后更新数据库以显示在cron作业运行时记录正在处理(大约需要30秒),并且cron作业设置为每秒运行一次,则在第二个1运行cron作业,但这个工作会在cron作业第二次运行之前等待完成,还是会在第二次运行?
由于
答案 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