извините, если этот вопрос был задан раньше, однако я не мог найти ничего подходящего при поиске.
В настоящее время у меня есть PHP-скрипт, который проверяет базу данных для следующей записи, которая не была обновлена. Мой вопрос заключается в следующем: если я затем обновляю базу данных, чтобы показать, что запись обрабатывается во время выполнения задания cron (что занимает около 30 секунд), а задание cron запускается каждую секунду, а во втором 1 выполняется задание cron , но будет ли это задание ждать завершения до того, как задание cron будет работать во второй раз или оно будет работать во втором 2?
благодаря
Если вы используете cronjob и не используете какой-либо блокировки в вашем php-скрипте, 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)
Используйте сокеты, чтобы что-то заблокировать. Поскольку, если сценарий заканчивается, порт сокета автоматически открывается снова.
<?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 с помощью * * * * *
Cronjob не будет ждать завершения предыдущего, прежде чем запускать новый экземпляр. Что вы хотите, это демон, см. « Запуск php-скрипта в качестве процесса демон»