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