Nasıl bir donanım hatasından sonra bu komut dosyasını geri mi?

3 Cevap php

Bu biraz genel olduğunu biliyorum, ama benim açıklama anlayacaksınız eminim. İşte durum:


Aşağıdaki kod, her 10 dakikada bir yapılır. Değişken "var_x" her zaman onun için hakemli harici bir metin dosyasına yazılır / okunur.

if ( var_x != 1 )
{
   var_x = 1;
   //
   // here is where the main body of the script is.
   // it can take hours to completely execute.
   //
   var_x = 0;
}
else
{
   // exit script as it's already running.
}


Sorun: Ben bir donanım arızası (betiğin zaman sert sıfırlama yapmak) "var_x" her zaman "1" olacaktır, çünkü o ana komut mantık tekrar çalıştırmak asla taklit eğer. (Ben zaten geri yükleme noktasını çalışmak mantık var).

Teşekkürler.

3 Cevap

Kilitlemek ve dosya kilidini açmak gerekir flock:

$fp = fopen($your_file);
if (flock($fp, LOCK_EX)) { )
{
   //
   // here is where the main body of the script is.
   // it can take hours to completely execute.
   //
    flock($fp, LOCK_UN);
}
else
{
   // exit script as it's already running.
}

Edit:

Sürü Windows makinelerde düzgün çalışması için değil gibi görünüyor, diğer çözümlere başvurmak zorunda. Kafama olası bir çözüm için bir fikir üstünden:

Bunun yerine var_x 1 ile yazma, getmypid üzerinden alınan işlem kimliği yazmak. Script yeni bir örneği dosyasını okuduğunda, o zaman bu kimliği ile çalışan bir işlem için sorgulama ve işlem bir PHP komut dosyası ise. Bir donanım arızasından sonra aynı PID elde başka bir PHP script olasılığı var gibi tabii ki, bu hala, yanlış gidebilir, bu nedenle çözüm kadar optimum değil.

Bu dosya kilitlerini kullanarak daha iyi çözülmüş olacağını düşünüyor musunuz? (Sıfırlama dosya kilitlerini oluştuğunda de sıfırlanır)

http://php.net/flock

Eğer süreç yönetimi için manuel semafor çeşit yapıyoruz gibi geliyor.

Aksine bir dosyaya yazarken daha, belki de bunun yerine bir environment variable kullanmalısınız. Eğer geri Bu yolla, başarısızlık durumunda, script kapalı bir semafor olmaz.