2016-03-18 3 views
0

У меня есть длинный сценарий (от 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, а не файл?

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

+0

Используйте запись базы данных с меткой времени, которая будет лучше. – shikhar

+0

использовать транзакцию и состояние работы хранилища в файле/db. – Gogol

+0

Не могли бы вы использовать транзакцию базы данных (и, вероятно, «УДАЛИТЬ», а не «TRUNCATE»?), Чтобы убедиться, что ваши данные не попадают в противоречивое состояние? –

ответ

0

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

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

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

Однако Cookies будут зависимыми от браузера и не будут работать с Cron.

+0

Сценарий, выполняемый заданием cron, не будет иметь сеанса. – Yoshi

+0

Не являются ли переменные сеанса для каждого пользователя? Скрипт будет выполняться как cron/task, так и пользователем. – displaynn

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