Artalan süreci olarak php komut dosyasını çalıştırın

8 Cevap php

Ben (talimatlar için bekleyin ve şeyler yapmak) artalan süreci olarak bir php komut dosyası çalıştırmak gerekir. eylemler kısa sürede talimat geldiğinde olarak alınması gereken çünkü cron iş benim için bunu yapmayacağım. Ben PHP gerçekten bellek yönetim sorunları nedeniyle daemon süreçleri için en iyi seçenek değildir biliyorum, ama çeşitli nedenlerle ben bu durumda PHP kullanmak zorunda. Ben (http://libslack.org/daemon) beni cini süreçlerini yönetmek yardımcı olacak gibi görünüyor, ama son 5 yıl içinde herhangi bir güncelleme olmamıştır, bu yüzden diğer bazı alternatifler biliyorum acaba Daemon denilen libslack tarafından bir araç geldi Benim durumumda için uygundur. Herhangi bir bilgi gerçekten takdir edilecektir.

8 Cevap

Sen kullanarak komut satırından (yani bash) sizin php script başlayabilir

nohup php myscript.php &

& arka planda süreci koyar.

Edit:
Yes, there are some drawbacks, but not possible to control? That's just wrong.
A simple kill processid will stop it. And it's still the best and simplest solution.

Eğer olabilir - bir kopyasını kapmak Advanced Programming in the UNIX Environment. Tüm bölüm 13 programlama deamon ayrılmıştır. Örnekler C, ancak tüm fonksiyon PHP (temelde pcntl ve posix uzantıları) içinde sarma olması gerekir.

Birkaç kelime - bir cini yazma (bu yalnızca posible * nix işletim sistemi-es tabanlı - Windows hizmetlerini kullanan) bu gibi:

  1. umask(0) izin sorunları önlemek için arayın.
  2. fork() ve ana çıkış var.
  3. setsid() diyoruz.
  4. SIGHUP (genellikle bu ihmal veya yapılandırmayı yeniden daemon sinyal vermek için kullanılır) ve SIGTERM (incelikle çıkmak için süreci anlatmak için) kurulumu sinyal işleme.
  5. fork() tekrar ana çıkış var.
  6. chdir() ile geçerli çalışma dir değiştirin.
  7. fclose() stdin, stdout ve stderr ve onlara yazmayın. Corrrect yolu ya /dev/null ya da bir dosyaya bu yönlendirmek, ama PHP içinde bunu yapmak için bir yol bulamadı. (Eğer bunu yapmak için, bilmiyorum nasıl kendinizi bulmak gerekecek :) kabuğu kullanarak onları yönlendirmek için daemon başlatmak zaman mümkündür.
  8. İşinizi yapın!

PHP kullanarak bu yana önce PHP 5.3 PHP çöp toplayıcı, bu başvuruları toplama hiçbir şekilde beri ve süreç bellek sızıntısı, olacak sonunda çöker kadar Ayrıca, döngüsel başvuruları için dikkatli olun.

Ben PHP cinleri sayıda çalıştırın.

Yani genel bizim için iyi bir çözümdür ben PHP bu iş için en iyi (hatta iyi) bir dil olmadığını size katılıyorum, ama cinleri web bakan bileşenleri ile kod paylaşabilirsiniz.

Bunun için daemontools kullanın. O, akıllı, temiz ve güvenilir. Aslında bizim cinleri tüm çalışan için kullanabilirsiniz.

Sen http://cr.yp.to/daemontools.html bu kontrol edebilirsiniz.

EDIT: özellikleri hızlı bir listesi.

  • Otomatik olarak yeniden başlatmada daemon başlar
  • Hatasında otomatik yeniden başlatma Dameon
  • Günlüğü rollover ve budama gibi, sizin için işlenir
  • Yönetim arayüzü: 'svc' ve 'svstat'
  • UNIX dostu (belki herkes için değil bir artı)

Başka bir seçenek kullanmak için Upstart. Bu aslında Ubuntu için geliştirilen (ve varsayılan olarak onunla paketlenmiş olarak geliyor), ancak bütün Linux dağıtımlarının için uygun olması amaçlanmıştır.

Otomatik olarak komut tamamlanması sistem önyükleme ve respawns cini başlar, bu yaklaşım, Supervisord ve daemontools benzer.

How to set it up:

/etc/init/myphpworker.conf yeni bir komut dosyası oluşturun. İşte bir örnek:

# Info
description "My PHP Worker"
author      "Jonathan"

# Events
start on startup
stop on shutdown

# Automatically respawn
respawn
respawn limit 20 5

# Run the script!
# Note, in this example, if your PHP script returns
# the string "ERROR", the daemon will stop itself.
script
    [ $(exec /usr/bin/php -f /path/to/your/script.php) = 'ERROR' ] && ( stop; exit 1; )
end script

Starting & stopping your daemon:

sudo service myphpworker start
sudo service myphpworker stop

Check if your daemon is running:

sudo service myphpworker status

Thanks

Ben bu tekniği öğrendi Kevin van Zonneveld Büyük bir teşekkür.

You can

  1. Henrik önerdiği gibi nohup kullanın.
  2. Içerde düzenli bir süreç olarak screen kullanın ve PHP programı çalıştırın. Bu size nohup kullanarak daha fazla kontrol sağlar.
  3. http://supervisord.org/ (Python ile yazılmış, ancak herhangi bir komut satırı programı daemonise ve size onu yönetmek için bir uzaktan kumanda verebilir) gibi bir daemoniser kullanın.
  4. Emil önerdi ama IMO overkill gibi kendi daemonise sarıcı yazın.

Ben size daha fazla özellikler veya işlevsellik istiyorsanız, o zaman en basit yöntem (bence ekran) ve tavsiye daha karmaşık yöntemlerle hareket ediyorum.

Bu sorunu çözmek için birden fazla yolu vardır.

Ben özelliklerini bilmiyorum ama belki PHP sürecini tetiklemek için başka bir yolu yoktur. Örneğin size kurulum komut dosyası çalıştırmak için bir tetikleyici olabilir bir SQL veritabanında olaylara dayalı çalıştırmak için kod ihtiyacınız varsa. Bu PostgreSQL altında yapmak gerçekten çok kolay: http://www.postgresql.org/docs/current/static/external-pl.html.

Dürüst olmak gerekirse ben senin en iyi bahis nohup kullanarak Damon süreç oluşturmak için olduğunu düşünüyorum. nohup komutu kullanıcının oturumu sonra bile yürütmeye devam etmek sağlar:

nohup php myscript.php &

Çok ciddi bir sorun ancak var. PHP'nin bellek yöneticisi tam çöp söylediğim gibi, bu bir script sadece birkaç saniye boyunca yürütülmesi ve daha sonra var olduğu varsayımı ile inşa edilmiştir. Sizin PHP script sadece birkaç gün sonra bellek gigabayt kullanmaya başlayacaktır. Ayrıca, bu gibi php script öldürür ve yeniden çoğaltılır, her 12 ya da belki 24 saat çalışan bir cron komut dosyası oluşturmak ZORUNLU:

killall -3 php
nohup php myscript.php &

Ancak komut bir işin ortasında ne olur? Peki öldürmek -3 bir kesme, CLI üzerinde ctrl + c yaparak olarak aynıdır. Sizin php komut dosyası düzgün PHP PCNTL kütüphanesi kullanarak bu kesme ve çıkış yakalamak: http://php.oregonstate.edu/manual/en/function.pcntl-signal.php

İşte bir örnek:

function clean_up() {
  GLOBAL $lock;
  mysql_close();
  fclose($lock)
  exit();
}
pcntl_signal(SIGINT, 'clean_up');

$ Kilidi arkasındaki fikir, PHP komut dosyası bir fopen ("dosya", "w") ile bir dosyayı açmak olabilir;. Sadece bir süreç bir dosya üzerinde yazma kilidi olabilir, bu nedenle bu kullanarak size PHP komut dosyası yalnızca bir kopyası çalıştığından emin olabilirsiniz.

İyi Şanslar!

Çıkış https://github.com/shaneharter/PHP-Daemon

Bu bir nesne yönelimli cini kütüphanedir. Bu günlüğü ve hata kurtarma gibi şeyler için yerleşik destek vardır ve bu plan işçileri oluşturmak için desteği vardır.