Проверка, работает ли процесс php уже

Я пытаюсь проверить, работает ли процесс уже при помощи временного файла 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 () с подобными результатами.

Спасибо

6
задан Borgtex 26 April 2010 в 16:04
поделиться

3 ответа

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

<?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");    
?>

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

0
ответ дан 17 December 2019 в 07:02
поделиться

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

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

2
ответ дан 17 December 2019 в 07:02
поделиться

Не могу быть уверенным в том, что не так с вашим конкретным случаем, предполагающим «нормальную, простую» среду, потому что это работает для меня, но, по крайней мере, у вас есть условие гонки в вашем коде. Что, если вы запустите два процесса одновременно и оба обнаружите, что 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
ответ дан 17 December 2019 в 07:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: