MySQL — лучший способ предотвратить запуск сценария PHP более одного раза одновременно?

У меня есть долго работающий скрипт (где-то от 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» вместо файла?

Есть ли способ лучше?

0

Решение

Я считаю, что файл блокировки может быть не идеальным, я бы скорее создал временную переменную сеанса, чтобы проверить «True» или «False», чтобы выяснить, работает скрипт или нет.

При желании я бы также отслеживал фактическое время, затрачиваемое на выполнение каждого скрипта, что может быть полезно для проверки ненужных временных дней и общего среднего времени.

Вы по-прежнему сможете использовать сеанс, даже если вы запускаете скрипт через CRON Scheduler, назначая вручную session_id() Перед использованием session_start(),

Однако файлы cookie зависят от браузера и не будут работать с Cron.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]