Я пытаюсь проверить, работает ли процесс уже при помощи временного файла 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 () с подобными результатами.
Спасибо
Что ж, отправка некоторых заголовков и очистка, похоже, работают для меня (не знаю почему), поэтому теперь, когда я загружаю страницу, отображается "Начать" и если я нажмите кнопку обновления в браузере перед завершением процесса, появится предупреждающее сообщение:
<?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");
?>
Спасибо за все ответы и предложения на данный момент
У меня работает.
Убедитесь, что сценарий может создать файл в каталоге. Раскомментируйте строку «unlink», запустите сценарий и проверьте, существует ли файл блокировки в каталоге. Если вы его не видите, это проблема с правами доступа к каталогу.
Не могу быть уверенным в том, что не так с вашим конкретным случаем, предполагающим «нормальную, простую» среду, потому что это работает для меня, но, по крайней мере, у вас есть условие гонки в вашем коде. Что, если вы запустите два процесса одновременно и оба обнаружите, что 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";
?>
Я тестировал его здесь, и, похоже, он работает.