PHP

2016-03-24 17 views
0

senaryo arka planda bir kabuk Koşu:PHP

  1. ben isteği tamamladıktan sonra bile çalışmaya devam gereken bir kabuk komut dosyası oluşturur (web üzerinden erişilen) bir PHP komut dosyası var.
  2. Ben diskteki bir dosyaya gönderilen çıktıyı gerek (yani "./script.sh> run.log")

ben çalışsam yaklaşım kabuk komut bitirmek için PHP hala bekliyor sonuçlanıyor gibi görünmektedir yürütülmesi. Ben denedim Yaklaşımları:

  1. nohup ./script.sh > run.log &
  2. nohup ./script.sh > run.log 2>&1
  3. nohup ./script.sh > run.log 2>&1 &
  4. ./script.sh &
  5. ./script.sh > run.log 2>&1
  6. ./script.sh > run.log &

ben olduğunu düşünüyorum Gerçekten belirgin bir şey eksik olabilir. Herhangi bir fikir?

+0

Kabuk komut dosyasının web sunucunuzla aynı kullanıcı olarak çalıştırılması gerekiyor mu? Kabuk betiğini başlatmak için bir çeşit artalanı çalıştırmaya ne dersiniz? PHP betiğinizin sadece bir tomora tetikleyici göndermesini sağlayın. Ayrıca, PHP betiğinizin gerçekten * kabuk betiğini * oluşturması gerekiyor mu? Bu benim için çok riskli görünüyor. – ghoti

cevap

1

Numaranız 5 yaklaşım yakın ama bu

gibi/dev/null Bu

shell_exec("/script.sh > run.log 2>&1 &"); 

gibi 6 ile birleştirmek Veya yönlendirmek gerekir

shell_exec("/script.sh > /dev/null 2>/dev/null &") 

PHP geliştirme sunucusunun komutları düzgün bir şekilde kaldıramayacağı anlaşılıyor. Apache veya NGinx gibi gerçek bir web sunucusu kullanmak sorunu çözecektir.

+0

Bu değişikliği yaptım ve PHP, kabuk betiği çalışmayı bitirene kadar hala engelleniyor. Sence PHP'nin yerleşik web sunucusunu kullanıyorum? Nginx/php-fpm'ye geçmek ister misiniz? – Zach

+0

nginx/php-fpm'yi kurdum ve bu sorunu çözdüm. ** PHP geliştirme sunucusunun komutları düzgün bir şekilde kaldıramayacağı anlaşılıyor. ** – Zach

2

Sana komut dosyası ile bir screen örneği başlatarak bunu başarmak düşünüyorum:

screen -d -m 'bash ./script.sh > run.log'