2010-04-26 12 views
6

próbuję sprawdzić, czy proces jest już uruchomiony za pomocą czasowego pliku demo.lock:Sprawdzenie, czy proces php jest już uruchomiony

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'; 
    } 
?> 

jednak nie robi Wygląda na to, że działa: jeśli dwukrotnie uruchomię plik demo.php, zawsze pokazuje on "wykonaną pracę", może dlatego, że uważa to za ten sam proces? czy jest jakiś sposób na zrobienie tego? Próbowałem również z getmypid() z podobnymi wynikami.

Dzięki

+0

proponuję użyć nazwany mutex na coś takiego, ale nie wiem, o ile są one dostępne w php .. –

+0

także , jaki jest twój system operacyjny? – zneak

+0

Próbowałem tego zarówno na windowsach, jak i na maszynach typu linux, z takimi samymi wynikami. – Borgtex

Odpowiedz

0

Cóż, wysyłanie nagłówków i spłukiwania wydaje się działać dla mnie (nie wiem dlaczego), więc teraz, gdy ładuję stronę, wyświetla się "Start" i jeśli kliknę przycisk odświeżania w przeglądarce przed zakończeniem procesu, ostrzeżenie komunikat:

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

Dzięki za wszystkie odpowiedzi i sugestie dotychczas

2

Działa u mnie.

Upewnij się, że skrypt może utworzyć plik w katalogu. Odkomentuj linię "odłącz" i uruchom skrypt i sprawdź, czy plik blokady istnieje w katalogu. Jeśli go nie widzisz, oznacza to problem z zezwoleniem na katalog.

+0

Wydaje mi się dziwne, że to też nie działa. PHP powinien wysłać ostrzeżenie, jeśli uprawnienia były złe. – zneak

+0

Czy próbowałeś komentować linię "odłącz"? (Przepraszam, to jest @Borgtex) @zne być może on nie widzi ostrzeżeń/błędów ... – zaf

+0

Pozwolenia są poprawne i po jednorazowym uruchomieniu plik jest tworzony, a następnie usuwany, nie wydaje się być z tym problemem . Problem polega na tym, że po uruchomieniu tego pliku w przeglądarce i powiedzmy 5 sekund po ponownym wywołaniu go w innej karcie, w tej drugiej instancji, zamiast wyświetlania komunikatu ostrzegawczego (ponieważ pierwsza jest już uruchomiona, a plik jest już utworzony) wykonuje cały proces ponownie. Jeśli utworzę dokładną kopię o nazwie demo2.php i uruchomię ją po kolei, działa ona zgodnie z oczekiwaniami; demo czeka 10 sekund i demo2 natychmiast pokazuje ostrzeżenie – Borgtex

2

Nie mogę być pewien, co jest nie tak z twoim konkretnym przypadkiem, zakładając "normalne, łatwe" środowisko, ponieważ działa to dla mnie, ale przynajmniej masz kondycję wyścigu w swoim kodzie. Co się stanie, jeśli rozpoczniesz dwa procesy dokładnie w tym samym czasie i że oba stwierdzą, że demo.lock nie istnieje?

Można użyć trybu fopen w trybie x, aby temu zapobiec. Tryb X próbuje utworzyć plik; jeśli już istnieje, zawiedzie i generuje błąd E_WARNING (stąd operator zamykający). Ponieważ operacje na systemie plików są atomiczne na dysku, gwarantuje się, że tylko jeden proces na raz może przechowywać plik.

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

?> 

Przetestowałem to tutaj i wygląda na to, że działa.

+0

+1 za test atomowy i zestaw – oedo

+0

dzięki za sugestię, widzę, jak używanie fopen dodaje kolejny poziom bezpieczeństwa do sprawdzania. Jednak nadal mam ten sam problem; To tak, jakby druga instancja oczekiwała na zakończenie pierwszej i usunięcie pliku, aby go ponownie utworzyć. – Borgtex

+0

@Borgtex: wtedy twój problem mnie bije. Nie rozumiem, dlaczego zawodzi. :/Cóż, przynajmniej mam nadzieję, że byłem przydatny. – zneak

Powiązane problemy