2010-04-26 2 views
6

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

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() с аналогичными результатами.

Thanks

+0

Я хотел бы предложить вам использовать именованный мьютекс для такой вещи, но я не знаю, если таковые имеются в PHP .. –

+0

также , какая у вас операционная система? – zneak

+0

Я пробовал это как на окнах, так и на машинах linux, с такими же результатами – Borgtex

ответ

0

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

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

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

2

Работы для меня.

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

+0

Кажется странным, что он тоже не работает. PHP должен отправить предупреждение, если разрешения были неправильными. – zneak

+0

Вы пробовали комментировать строку «unlink»? (Извините, это @Borgtex) @zneak, может быть, он не видит предупреждений/ошибок ... – zaf

+0

Права и правильность и за один проход, файл создается, а затем удаляется, кажется, что это не проблема с этим , Проблема заключается в том, что когда я запускаю этот файл в браузере и, скажем, через 5 секунд после того, как снова его вызову на другой вкладке, этот второй экземпляр вместо показа предупреждающего сообщения (поскольку первый из них уже запущен и файл уже создан) делает весь процесс снова. Если я создам точную копию с именем demo2.php и запускаю ее один за другим, она работает так, как ожидалось; demo ждет 10 секунд, а demo2 мгновенно показывает предупреждение – Borgtex

2

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

?> 

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

+0

+1 для атомного теста и набора – oedo

+0

спасибо за предложение, я вижу, как использование fopen добавляет еще один уровень безопасности для проверки. Тем не менее, у меня все еще такая же проблема; Это похоже на то, что второй экземпляр ждет завершения первого и удалит файл для его создания. – Borgtex

+0

@Borgtex: тогда ваша проблема бьет меня. Я не понимаю, почему это терпит неудачу. :/Ну, по крайней мере, я надеюсь, что я был полезен. – zneak

Смежные вопросы