Bir daemon için PHP kullanmak akıllıca mı?

16 Cevap php

Ben bir arka plan işlemi oluşturmak için diliyorum ve bu genellikle bu tür C falan yazılmıştır söylendi. Geçenlerde PHP bir cini oluşturmak için kullanılan olabilir ve ben bu şekilde PHP faydalanmak gerekir eğer bazı tavsiyeler almak için umuyordum bulduk.

İşte bir daemon benim gereksinimleri vardır.

  • Continuously check if a row has been added to MySQL database table
  • Run FFmpeg commands on what was retrieved from database
  • MySQL tabloya çıktı takın

Ben bu kararı vermenize yardımcı olmak için sunabileceği başka ne emin değilim. Sadece eklemek için, önce C yapmadım. Sadece Java ve PHP ve temel bash betik.

Hatta bir performans farkının bu kadar mı?

Benim cehalet için izin verin, ben öğreniyorum! :)

Tüm teşekkürler

16 Cevap

Diğerleri de belirtildiği gibi, PHP çeşitli versiyonları kendi çöp toplayıcıları ile ilgili sorunlar var. Eğer sürüm böyle sorunları yok biliyorum eğer Tabii ki, bu sorunu ortadan kaldırmak. Nokta daemon yazmak ve görmek valgrind aracılığıyla çalıştırmak kadar don't (kesinlikle) biliyorsunuz, herhangi bir makinede yüklü PHP sızıntı olup olmadığını. Böylece yandan, sadece Zend ne düşündüğünü hâlâ buggy olabilir sabit veya PHP biraz eski bir sürümünü veya bazı uzantısı ile ilgili olduğunu keşfetmek için yazabilirsiniz. Icky.

Diğer sorun biraz adamcağız sinyallerdir. Benim durumumda, sinyal işlemcileri her zaman sinyal sıraya yerine birleştirilir, özellikle PHP ile doğru girilmedi. Yani sadece SIGINT/SIGUSR1/SIGUSR2/SIGHUP işlemek gerekir, yani eğer, sizin için bir sorun olmayabilir.

Yani, ben öneririm:

Daemon basit ise, devam edin ve PHP kullanmak. Bu onun oldukça karmaşık olsun, ya da bol bellek ayırmak için gidiyor gibi görünüyorsa, PHP bunu prototip sonra C yazmayı düşünebilirsiniz.

Ben oldukça zor ölür C insanım. Ancak, hızlı (ben açıklandığı durumlarda ötesinde) PHP kullanarak bir şey oluşmasında yanlış bir şey görmüyorum. Ben de veritabanı şeyler size Yani içinde C'de diğer arayüzleri kullanarak yönetme geri aramalar karşı, PHP kullanırsanız çok daha basit olacak, ya da daha sonra Örneğin C ile yeniden olmayabilir şey prototip için PHP kullanarak işleme ile yanlış bir şey görmek Bu örnek, bir 'tek off' için, mutlaka çok daha hızlı halletmek olacak.

Doğrusu bir daemon yoklama veritabanı daha, bir cron ile bu görevi gerçekleştirmek için eğimli olacak.

Bu doğru, FFmpeg komut, bir şey yapmak için bir süre alacaktır olasıdır? Bu durumda, sürekli yoklama veritabanı için really gereklidir? Her dakika (ya da her beş, bu konuda on ya da yirmi dakika) çalıştıran bir cronjob aynı şeyi elde etmek için basit bir yol olmaz mıydı?

Php daha iyi ya da daha kötü bir şey bu tür diğer ortak betik dilleri herhangi bir daha değil. Bu işin bu tür yapmak gerekir sistem çağrıları ve kütüphane programları tüm oldukça tam erişim vardır. Eğer komut dosyası için PHP kullanarak en rahat iseniz, o zaman php sizin için iş yapacak.

Sadece aşağı tarafı php unix hemen her lezzet yüklü Perl veya Python, diyelim ki, gibi oldukça her yerde olmasıdır. Php sadece dinamik web içeriği sunan olacak sistemleri üzerinde bulunur. Bir Php tercüman da yüklemek çok büyük veya pahalı olduğunu, ancak en büyük endişe birçok sistem için program oluyor ise, bu hafif bir engel olabilir değil.

Ben aykırı olması ve php daemon deneyin tavsiye ederiz. Bu görünüşte iyi bildiğiniz dildir. Sen muhtemelen herhangi bir durumda zamanlayıcı dahil edeceğiz, böylece veritabanında sorgulama frekansı çoğaltabilirsiniz. Herhangi bir ceza sürece safça bir sorguya döngü değil gibi gerçekten var.

Sık sık idam şey değil ise, alternatif olarak, cron php çalıştırmak youor kodu kuyruğunu drenaj icar ve sonra ölebilir.

Ama ilk yaklaşım olarak, en iyi bildiklerini sopa ile korkmayın.

Tetikler kullanmamaya çalışın. Bunlar gereksiz kancası empoze edeceğiz ve onlar test ve hata ayıklama hiç eğlenceli değilsin.

Yakın anlık eylemleri gerekli değilse bir cron işi muhtemelen sadece iyi çalışır.

Ben, canlı kuyruk daemon'ıdır ben inşa ettik bir sistem, 'beanstalkd' koymak üzereyim. Ben (bu durumda, PHP) web cini çağrıları ve bir PHP komut dosyası daha sonra kuyruğundan onları alır ve bu tür görüntüleri yeniden boyutlandırma veya (genellikle bir Memcache ile geri bilgisi geçen veritabanlarını kontrol gibi çeşitli görevleri gerçekleştiren çeşitli küçük göndermek -tabanlı mağaza).

Senaryoyu yeniden, her (diyelim ki) 50 görevler için gerçekleştirilen oluyor edecek, uzun soluklu işlemleri önlemek için, ben değerine bağlı olarak ("exit (1)") komut döndü ki, bir betik bunu sarılmış ettik . Ben, o anında yapacağız bunu planlıyoruz çünkü yeniden başlatılmasını eğer yeniden başlatılması önce, başka bir çıkış değeri (varsayılan 0, bu yüzden kullanan yok) birkaç saniye duraklama olur.

Makul belirlenen periyodiklik ile bir cron işi olarak çalışan, bir PHP komut dosyası işi yapabilir ve üretim istikrar kesinlikle başarılabilir. Eş zamanlı FFMpeg örneklerinin sayısını sınırlamak isteyen, ve komple bir uygulama günlüğü ve istisna işleme var emin olabilir. Ben de her-on dakikalık cron'd PHP script olarak, Java sürekli çalışan yoklama işlemleri uygulamış ve hem de güzel bir iş yapmak.

Düzgün bir PHP komut dosyası Daemonizing ile bir sorun PHP dosya tanımlayıcıları çıkarılması için gerekli olan dup () veya dup2 () sistem çağrıları, arayüzler sahip olmamasıdır.

Bunun yerine bir cini bir system komutunu (yani FFmpeg) yürüten bir mysql trigger yapma düşünebilirsiniz. Bazı gecikme bir sorun değilse, ayrıca her birkaç dakikada kontrol yürütür cron şey koyabilirsiniz. Bir seçenek ise cron, benim seçim olacaktır.

Sorunuzu yanıtlamak için, php bir daemon olarak çalıştırmak için gayet olumlu. Bu C'de yapılması gerek yoktur

Eğer Kent Fredric, tokenmacguy ve Domster gelen cevapları birleştirmek eğer faydalı bir şey olsun.

php is probably not good for long execution times, so let's keep every execution cycle short and make sure the OS takes care of the cleanup of any memoryleaks. As a tool to start your php script cron can be a good tool. And if you do it like that, there is not much difference between languages.

However, the question still stands. Is php even capable to run as a normal daemon for long times (some years)? Or will assorted memoryleaks eat up all your ram and kill the system?

/ Johan

Bunu yaparsanız, bellek sızıntıları dikkat. PHP 5.2 this (5.3 sabit) göre, kendi çöp toplayıcı ile bazı sorunları var. Belki de daha iyi cron kullanacak, böylece komut her çalıştırmak temiz başlar için.

Eğer tarif ettik ne için, ben bir cini ile gitmek istiyorum. Yeni görevler vardır zaman veritabanı bombalamaya yok, böylece anket döngü içinde bir uyku sadık emin olun. Bir cronjob sonraki çalışmasını tetikleyen bazı özel bir olay yoktur işlerin iş akışı / rapor türü için iyi çalışır.

Belirtildiği gibi, PHP bellek yönetimi ile bazı sorunları var. Bu uzun süren bir script, zamanla kurmak, çünkü, bellek sızıntıları için kod sınama emin olmak gerekir. PHP gerçek çöp toplama sahip değildir - Bu döngüsel başvurular sızıntıları neden olacak demektir, referans sayım dayanır. Eğer bunun farkında iseniz, etrafında kodu olabilir.

Eğer cin rota aşağı gitmek için karar verirseniz, System_Daemon which I've recently used successfully on a PHP v5.3.0 installation. It is documented on the authors blog: http://kevin.vanzonneveld.net/techblog/article/create_daemons_in_php denilen büyük ARMUT modülü var

Eğer PEAR yüklü varsa, kullanarak bu modülü yükleyebilirsiniz:

pear install -f System_Daemon

Ayrıca başlatma komut dosyası oluşturmak gerekir: /etc/init.d/<your_daemon_name>

Sonra yapabilirsiniz:

  • Başlangıç ​​Daemon: /etc/init.d/projNotifMailDaemon start
  • Dur Daemon: /etc/init.d/projNotifMailDaemon stop

Kayıtlar tutulur: /var/log/<your_daemon_name>.log

Ben bunu tavsiye etmem. PHP uzun süreli yürütülmesi için tasarlanmış değildir. Onun kısa ömürlü sayfaları ile öncelikle tasarlanmıştır.

Benim durumumda PHP büyük görevler bazı bellek sızıntısı ile ilgili sorunlar olabilir.

Bir cron iş ve bash scripting biraz bunu sesleri ile ihtiyacınız olan her şey olmalıdır. Sen gibi şeyler yapabilirsiniz:

$file=mysqlquery -h server < "select file from table;" ffmpeg $file -fps 50 output.a etc.

böylece bash PHP kullanmak daha IMHO, yazmak liman ve korumak daha kolay olurdu.

Cron işi? Evet.

Daemon hangi sonsuza kadar çalışır? Hayır.

PHP bir çöp toplayıcı (ya da en azından, ben öyle değil mi kontrol son kez) yoktur. Eğer dairesel bir başvuru oluşturmak, bu nedenle, o kadar temizlenmiş olur ASLA - en azından ana komut dosyası yürütme bitinceye kadar. Cini süreçte bu yaklaşık asla.

Onlar yeni sürümlerinde bir GC eklediyseniz, o evet yapabilirsiniz.

Go for it. I had to do it once also. Like others said, it's not ideal but it'll get-er-done. Using Windows, right? Good.

If you only need it to run occasionally (Once per hour, etc). Make a new shortcut to your firefox, place it somewhere relevant. Open up the properties for the shortcut, change "Target" to:

"C:\Program Files\Mozilla Firefox\firefox.exe" http://localhost/path/to/script.php

Go to Control Panel>Scheduled Tasks Point your new scheduled task at the shortcut.

If you need it to run constantly ya da sözde-sürekli, biraz senaryoyu baharat gerekir.

Lütfen komut ile başlayın

set_time_limit(0);
ob_implicit_flush(true);

Komut bir döngü kullanıyorsa (gibi while) Eğer tampon temizlemek zorunda:

$i=0;
while($i<sizeof($my_array)){
     //do stuff
     flush();   		
     ob_clean();
     sleep(17);
     $i++;
}