У меня есть длинный сценарий (от 30 до 160 секунд, основанный на настройках), который запрашивает данные из API с помощью NuSOAP, на основе этих данных он строит один большой запрос на вставку ~ 1000-4000 строк. Это чем обрезает таблицу и вставляет большой запрос.Лучший способ предотвратить запуск скрипта PHP одновременно более одного раза?
Когда я запускаю скрипты, слишком тщательно синхронизированные один за другим, он создает проблему, когда он теряет данные. Я хочу, чтобы этот сценарий не запускался дважды одновременно.
Этот сценарий в будущем также будет запускаться каждые ~ 5-10 минут через cron/task scheduler.
В настоящее время я блокировать запуск сценария одновременно проверяя, существует ли файл:
<?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, а не файл?
Есть ли лучший способ?
Используйте запись базы данных с меткой времени, которая будет лучше. – shikhar
использовать транзакцию и состояние работы хранилища в файле/db. – Gogol
Не могли бы вы использовать транзакцию базы данных (и, вероятно, «УДАЛИТЬ», а не «TRUNCATE»?), Чтобы убедиться, что ваши данные не попадают в противоречивое состояние? –