У меня есть долго работающий скрипт (где-то от 30 до 160 секунд, в зависимости от настроек), который запрашивает данные из API, используя NuSOAP, на основании этих данных он создает один большой запрос вставки ~ 1000-4000 строк. Это чем усекает таблицу и вставляет большой запрос.
Когда я запускаю сценарии слишком близко по времени, один за другим, это создает проблему, когда он теряет данные. Я хочу, чтобы этот скрипт не запускался дважды одновременно.
Этот скрипт в будущем также будет запускаться каждые ~ 5-10 минут через планировщик cron / task.
В настоящее время я блокирую запуск скрипта одновременно, проверяя, существует ли файл:
<?php
header('content-type: application/json');
ignore_user_abort(true);
if (!file_exists('lock.txt')) {
$lock = fopen('lock.txt','w');
fclose($lock);
//~450 API requests using NuSOAP.
//TRUNCATE `table`
//INSERT ~1000-4000 rows into `table
$jsonArray = array(utf8_encode('script')=>utf8_encode('finished'));
unlink('lock.txt');
} else {
$jsonArray = array(utf8_encode('script')=>utf8_encode('locked'));
}
echo json_encode($jsonArray);
?>
Это безопасный способ заблокировать запуск сценария одновременно? Лучше проверить, если столбец MySQL содержит «true» или «false» вместо файла?
Есть ли способ лучше?
Я считаю, что файл блокировки может быть не идеальным, я бы скорее создал временную переменную сеанса, чтобы проверить «True» или «False», чтобы выяснить, работает скрипт или нет.
При желании я бы также отслеживал фактическое время, затрачиваемое на выполнение каждого скрипта, что может быть полезно для проверки ненужных временных дней и общего среднего времени.
Вы по-прежнему сможете использовать сеанс, даже если вы запускаете скрипт через CRON Scheduler, назначая вручную session_id()
Перед использованием session_start()
,
Однако файлы cookie зависят от браузера и не будут работать с Cron.
Других решений пока нет …