Daemon olarak çalışan bir PHP komut dosyası tutmak için en iyi yolu nedir?

9 Cevap php

Ne bir daemon olarak çalışan bir PHP komut dosyası tutmak için en iyi yoldur ve ne ihtiyaçları yeniden başlatmadan olmadığını kontrol etmek için en iyi yoldur.

Ben 7/24 çalıştırmak için gereken ve çoğunlukla I nohup kullanarak çalıştırabileceğiniz bazı komut dosyaları var. Onlar aşağı giderseniz, otomatik olarak yeniden başlatılabilir, böylece onu izlemek için en iyi yolu nedir?

9 Cevap

(Eğer barındırma paylaşılan, vb konum) bunun için (uygun) init yapısını kullanmak yapamıyorsanız, kullanım cron denetler her birkaç dakikada (o ne gibi bir dil ile yazılmış olabilir) bir komut dosyasını çalıştırmak için kaçmalarının görmek ve gerekirse bunları yeniden başlatır.

Daemon is a linux process that runs in background; apache or mysql are daemons. In a linux environment, we can run a background program using cronjob, but it has some limitations, and in some scenarios it' s not a good idea. For example, using cronjob, we can't control if the previously run has finished yet. So often it's more convenient run a process as a daemon.

// Daemonize
$pid = pcntl_fork(); // parent gets the child PID and child gets 0
if($pid){ // if pid is not 0
     // Only the parent will know the PID. Kids aren't self-aware
     // Parent says goodbye!
     print "Parent : " . getmypid() . " exiting\n";
     exit();
}
print "Child : " . getmypid() . "\n";

Yukarıdaki kod php bir cini nasıl oluşturulacağı konusunda çok iyi bir makaleden alınmıştır. Sen link bu okuyabilirsiniz

Lütfen cini yeniden hızlı ve kirli cron:

* * * * * USER ps auxww | grep SCRIPTNAME > /dev/null || SCRIPTNAME

Cini senin script adı gibi ve komut dosyasının çalıştıran kullanıcı ile KULLANICI değiştirin. /etc/cron.d/restart_php_daemon bu sopa. Her dakika çalışmalıdır. Değiştir ilk * */2 veya */5 daha az sıklıkta çalıştırmak için için.

UPDATE

Eğer kendi crontab içine bu koyarak yapıyorsanız:

Run crontab -e ve ekleyin:

* * * * * ps auxwww | grep SCRIPTNAME > /dev/null || SCRIPTNAME

Biz mail çıkışını aktarmak bizim cinleri çalıştırın.

php daemon.php | mail -s "daemon stopped" foo@example.org

Cini durursa, bir mail gönderir ve biz bu şekilde haberdar edilecektir / Bu şekilde,.

Bu elbette hala cinleri elle yeniden başlatılması anlamına gelir, ama biz hemen anlarsınız. Cinleri durdu Genellikle, yine de dikkat alınması gereken başka bir şey var demektir, bu yüzden genellikle ok bulunuyor.

Ben bir wget çalışan ve paylaşılan bir sunucuda / dev / null sonucu göndererek başarı elde ettik.

En zarif çözüm phpdaemon veya reactPHP olduğunu.

TBH, PHP muhtemelen bunun için tasarlanmıştır ne gerçekten, bunun için en iyi araç değil değil. Ben bu deneyin ne zaman oluyor bellek sızıntıları ve diğer kötü şeyler duydum. Ayrıca zihin PHP ayı, sadece bir komut dosyası yürütme başına (dosya kolları, db bağlantıları vb için) kaynak kimlikleri sonlu miktarda vardır.

Başka bir şey kullanarak daha iyi olun, belki python veya perl, ben apps bu tür yazı herhangi bir gerçek deneyimi yok, ama ben PHP senin yapmaya çalıştığınız şey için doğru olmadığını biliyorum gerçi.

Ben bir veritabanından okuma ve (PEAR MAIL_QUEUE kütüphanesini kullanarak) e-postalar göndermek için PHP tabanlı bir komut dosyası kullanabilirsiniz. Ben bir bash komut dosyası içinde çalıştırmak ve iade sonucuna dayanarak ("çıkış $ durumu;") durdurmak, uyku X saniye, ya da hemen yeniden başlatmak. (Ben de posta sistemini vurgulayarak önlemek için PHP komut dosyası içine yük ortalaması / uyku bir kontrol koymak).

Sürekli çalışıyor olması gerekiyordu, uzun vadeli bir cini için ise (ben başarılı bir uzun vadeli kaçtın bazı soketli sunucular duymuş olsa da), o zaman, ancak, muhtemelen bu çalıştırmak için iyi bir şey olmaz, katılıyorum PHP 5.3 şimdi de çöp toplama düzeldi etmez ve script iyi plansız çıkmak değil yeterli yazılır, sonra hafıza çok daha az sorun daha önce olmalıdır.

Ben size bu kadar böyle veritabanı erişimi gibi uygulama bileşenlerini yeniden ve böylece PHP kullanmak istiyorum ancak neden anlayabiliyorum, PHP bunun için en iyi araç olmadığını kabul ediyorsunuz.

Ben benzer bir sorun vardı ve ben PHP komut dosyalarını çalıştırabilirsiniz C ile yazılmış bir servistir Yağ Kontrol gelişmekte sona erdi. Ayrıca paralel bir script birçok örneklerini çalıştıran, bir çok iş parçacıklı daemon olarak çalıştırabilirsiniz.

Daha fazla bilgi ve kullanım durumları var burada: http://www.4pmp.com/fatcontroller/