Bir php işlemi zaten çalışıyorsa olmadığını kontrol etme

3 Cevap php

Ben bir işlem zaten zamansal bir dosya demo.lock kullanarak çalışıp çalışmadığını kontrol etmek çalışıyorum:

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

Ancak çalışmak için görünmüyor: Ben iki kez demo.php açarsanız her zaman "işi" gösterir, bunun aynı işlem gördüğü belki de? Bunu yapmak için bir yol var mı? Ben de benzer sonuçlar ile getmypid () ile çalıştı.

Teşekkürler

3 Cevap

Benim için çalışıyor.

Komut dizinde bir dosya oluşturabilirsiniz emin olun. "Unlink" satırı yorumsuz ve komut dosyasını çalıştırın ve kilit dosyası dizininde olup olmadığını kontrol edin. Eğer bunu göremiyorsanız, o zaman bir dizin izinleri sorunu bulunuyor.

Benim için çalışıyor, ama en azından sizin kodunda bir yarış durumu var çünkü özel bir durum "normal, kolay" ortamı varsayarak nesi konusunda emin olamaz. Eğer aynı anda iki süreçleri başlatmak ve eğer hem ne demo.lock var olmadığını bulmak?

Sen fopen with the x modu Bunu önlemek için kullanabilirsiniz. X mod dosyası oluşturmak için çalışır; Zaten varsa, başarısız olur ve bir E_WARNING hata (dolayısıyla shut-up operatör) üretir. Dosya sistemi operasyonları bir sürücüde atom olduğundan, bir seferde sadece tek bir işlem dosyası tutabilir garantilidir.

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

?>

Ben burada test ettik ve o iş gibi görünüyor.

Eh, bazı başlıkları gönderme ve kızarma benim için çalışmak gibi görünüyor ben yüklediğinizde (emin değilim neden), şimdi sayfa "Başlat" gösterir ve ben tamamlamadan önce, tarayıcınızın yenile butonuna basarak ise, uyarı mesajı:

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

Tüm cevaplar ve önerileriniz için teşekkür ederiz şimdiye kadar