Проверка, запущен ли процесс php - PullRequest
6 голосов
/ 26 апреля 2010

Я пытаюсь проверить, запущен ли уже процесс, используя временный файл demo.lock:

demo.php:

<?php
    $active=file_exists('demo.lock');
    if ($active)
    {
        echo 'process already running';
    }
    else
    {
        file_put_contents ('demo.lock', 'demo');
        sleep(10);  //do some job
        unlink ('demo.lock');
        echo 'job done';
    }
?>

однако, похоже, это не работает: если я дважды открываю demo.php, он всегда показывает «выполненную работу», может быть потому, что он считает, что это один и тот же процесс? есть ли способ сделать это? Я также пытался с getmypid () с похожими результатами.

Спасибо

Ответы [ 3 ]

2 голосов
/ 26 апреля 2010

Не могу быть уверен в том, что не так с вашим конкретным случаем, если принять «нормальную, простую» среду, потому что она работает для меня, но, по крайней мере, в вашем коде есть условие гонки. Что если вы запустите два процесса в одно и то же время, и оба обнаружат, что demo.lock не существует?

Вы можете использовать fopen с режимом x, чтобы этого не происходило. Режим X пытается создать файл; если он уже существует, он выходит из строя и генерирует ошибку E_WARNING (отсюда и оператор отключения). Поскольку операции с файловой системой на диске являются атомарными, гарантируется, что файл может содержать только один процесс за один раз.

<?php

$file = @fopen("demo.lock", "x");
if($file === false)
{
    echo "Unable to acquire lock; either this process is already running, or permissions are insufficient to create the required file\n";
    exit;
}

fclose($file); // the fopen call created the file already
sleep(10); // do some job
unlink("demo.lock");
echo "Job's done!\n";

?>

Я проверил это здесь, и похоже, что оно работает.

2 голосов
/ 26 апреля 2010

У меня работает.

Убедитесь, что скрипт может создать файл в каталоге. Раскомментируйте строку «unlink», запустите скрипт и проверьте, существует ли файл блокировки в каталоге. Если вы этого не видите, значит проблема с правами доступа к каталогу.

0 голосов
/ 28 апреля 2010

Что ж, мне кажется, что отправка некоторых заголовков и очистка работает (не знаю почему), поэтому теперь, когда я загружаю страницу, отображается «Пуск» и, если я нажимаю кнопку обновления в браузере до завершения процесса, появляется предупреждающее сообщение :

<?php

$file = @fopen("demo.lock", "x");
if($file === false)
{
    echo "Unable to acquire lock; either this process is already running, or permissions are insufficient to create the required file\n";
    exit;
}

header("HTTP/1.0 200 OK");
ob_start();
echo "Starting";
header('Content-Length: '.ob_get_length(),true);
ob_end_flush();
flush();

fclose($file); // the fopen call created the file already
sleep(10); // do some job
unlink("demo.lock");    
?>

Спасибо за все ответы и предложения до сих пор

...