2015-09-21 4 views
0

извините, если этот вопрос задан раньше, однако я не смог найти что-либо релевантное при поиске.Выполнение задания Cron непрерывно

В настоящее время у меня есть PHP-скрипт, который проверяет базу данных для следующей записи, которая не была обновлена. Мой вопрос заключается в следующем: если я затем обновляю базу данных, чтобы показать, что запись обрабатывается во время выполнения задания cron (что занимает около 30 секунд), а задание cron запускается каждую секунду, а во втором 1 выполняется задание cron , но будет ли это задание ждать завершения до того, как задание cron будет работать во второй раз или оно будет работать во втором 2?

Благодаря

+0

Конечно, минимальное время для расписания хрон одна минута? –

+0

И нет, задания cron будут выполняться по расписанию, и если они перекрываются, то это зависит от вашего кода, чтобы обрабатывать вещи, cron не заботится о том, что предыдущая работа все еще запущена. –

+0

Может быть, лучший способ добиться того, что я есть пытаясь сделать это - я создаю систему, в которой будет несколько пользователей, каждая из которых имеет подключенный онлайн-канал продаж, например Amazon. Мне нужно постоянно отслеживать заказы для каждой из учетных записей, в идеале в то же время, однако, если одна из учетных записей имеет большой объем заказов и занимает больше минуты, чтобы вернуть все страницы данных в моем сценарий, я не хочу, чтобы все остальные аккаунты прекратили опрос, пока заказы на эту учетную запись загружены, если это имеет смысл? –

ответ

1

Если вы используете cronjob и не использует какой-либо блокировки в вашем PHP скрипт хрон будет работать более чем один экземпляр сценария, если событие происходит раз до последнего сценария закончена.

Чтобы избежать такой проблемы вы можете сделать что-то вроде этого:

$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) 
+0

Хорошо большое спасибо, поэтому, если второе задание cron работает до завершения первого задания cron, я предполагаю, что он не прервет первую работу cron? (Это действительно то, что я хочу, мне нужно, чтобы он непрерывно обрабатывал следующую запись, даже если предыдущая запись еще не закончилась). –

+1

@MikeBowyer Это может повлиять или не повлиять на первое задание в зависимости от типа обработки и логики, которые вы написали в своем скрипте; но это будет плохой идеей для вас ваш код таким образом; Я настоятельно рекомендую вам пойти с блокировкой. –

+0

Существует большая проблема с блокировкой, если по какой-либо причине сценарий разбился или перезапущен сервер во время работы сценария, задание cron никогда не будет запускаться снова, пока вы вручную не удалите файл блокировки – SirNarsh

0

cronjob не будет ждать, пока предыдущий, чтобы закончить перед запуском нового экземпляра. Что вы хотите, это демон, см. Run php script as daemon process

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 с * * * * *

Смежные вопросы