Возникли проблемы с разрешением только одного экземпляра PHP-скрипта за раз с использованием Cron - PullRequest
1 голос
/ 21 июня 2010

Я не могу понять это.

У меня есть скрипт типа валидатора, который проверяет определенные файлы на моем сервере (проверяет, существует ли он, его содержимое и т. Д.).Я хочу, чтобы он работал непрерывно только с одним экземпляром, не более.Текущее решение, которое у меня есть, похоже, не работает, я думаю, из-за тайм-аутов (возможно, и по другим причинам).Для каждого файла, который я проверяю, я устанавливаю таймаут php на 60 секунд.У меня это вверху скрипта:

    $trigger_file2 = 'path/to/a/randomfile';

    if (file_exists($trigger_file2)){
        //another script is working, exit
                exit;
    }

    // create file inside app
    $handle = fopen($trigger_file2, 'w');
    fwrite($handle, '0');
    fclose($handle);

В конце скрипта я просто использую unlink () в файле триггера.Из-за возможных таймаутов и, возможно, других причин, файл триггера не всегда удаляется и вызывает проблемы.Я также попытался добавить код, который проверяет время изменения файла триггера и, если он старше 10 минут, удаляется, но это действительно неэффективно, так как проблема возникает часто.

Любые идеи о том, как обойтиэтот?Я думал о том, чтобы сделать что-то с PID для запуска скриптов, но я использую CakePHP для скрипта, поэтому каждый процесс выглядит так, как будто он использует index.php (я думаю).

Любые другие идеи о том, как это сделать?Помощь будет очень признательна.

1 Ответ

3 голосов
/ 21 июня 2010

Я предлагаю вам сделать блокировку не самого файла, а фактической блокировки файла .

$fp = fopen($trigger_file2, "r+");

if (!flock($fp, LOCK_EX | LOCK_NB)) {
    die("another script running");
}

LOCK_NB не соблюдается в Windows, но вы, похоже, не используете его.

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