komut olarak çalışır shell_exec komutunun çıktısını almak

0 Cevap php

Ben daha önce sunucuya yüklendiği bir JFFS2 görüntünün dosya adını kabul etmek için tasarlanmış bir PHP komut dosyası web sayfası kodlama duyuyorum. Komut dosyası daha sonra bir görüntü ile sunucuda bölümü ve çıkış sonuçları yeniden flaş etmektir. Ben bunu kullanarak olmuştu:

$tmp = shell_exec("update_flash -v " . $filename . " 4 2>&1");
echo '<h3>' . $tmp . '</h3>';

echo verifyResults($tmp);

(VerifyResults işlevi Yani, güncelleştirme başarıyla tamamlar durumda, vs cihazı yeniden başlatmak için bir düğme görüntüler güncelleme Komut başarıyla tamamlandı. Kullanıcıya gösteren bazı HTML dönecektir)

Bu sorun güncelleştirme komutu tamamlamak için birkaç dakika sürer ve bu çıkışı her döndürür önce kabuk komutunun kadar PHP komut dosyası blokları tam olmasıdır. Bu genellikle kullanıcı (en kötü) bir HTTP 504 hata görmek veya birkaç dakika yüklemek için sayfa için beklemek olurken güncelleştirme komutu, yayınlanmaya devam edecek demektir.

Ben bunun yerine böyle bir şey yaptığını düşünüyordum:

shell_exec("rm /tmp/output.txt");
shell_exec("update_flash -v " . $filename . " 4 2>&1 >> /tmp/output.txt &");
echo '<div id="output"></div>';
echo '<div id="results"></div>';

Bu teorik arka planda komut koymak ve / tmp / Output.txt tüm çıktıyı eklemek istiyorum.

Ve sonra, bir JavaScript işlevi, ben periyodik olarak sadece / tmp / Output.txt içeriğini yazdırmak ve "çıkış" div içine sopa hangi, getOutput.php rica ediyorum. Komutu tamamıyla yapıldıktan sonra, başka bir JavaScript işlevi çıkış işlemek ve "sonuç" div sonucu görüntülemek olacaktır.

Ama ben burada görmek sorunun bir güncelleştirme için hedeflenen hangi bölüme çünkü getOutput.php sonunda, cihazın flaş bellek güncelleme işlemi sırasında erişilemez olacak olmasıdır. Yani 504 veya görünüşte ebediyen yükleme sayfasında olmadan da olsa, daha önce olduğu gibi aynı pozisyonda beni bırakabilir.

Ben cihazın başka bir bölüme getOutput.php hareket olabilir, ama sonra ben hala webroot dan kendisine (orada bir sembolik bağ erişmek mümkün web sunucusu yapılandırması ile bazı funky şeyler yapmak zorunda düşünüyorum olur, başka gibi dosya, sonunda yeniden flaş) sırasında yazılmaz.

Çalıştırır, ya da sadece ben çözümü ile yetinmek gerektiği gibi komutunun çıkışını gösteren başka bir yolu var mı?

Edit 1: Şu anda bazı çözümler test ediyorum. Daha sonra sonuçlar ile sorumu güncelleme olacak.

Edit 2: Ben aslında düşündüm gibi dosya sistemi yazılır almaz gibi görünüyor. Bunun yerine, sistem salt okunur modda mevcut mount gibi görünüyor, bu yüzden hala dosya sistemi yeniden parladı sonra bile getOutput.php erişebilirsiniz.

Sorumun açıklanan İkinci çözüm (aşağıda bir cevap belirtildiği gibi) yerine shell_exec arasında popen kullanarak ek olarak çalışmıyor gibi görünüyor. Sayfa yükler ve Ajax ile ben Output.txt içeriğini görüntüleyebilir.

However, bu çýktý.txt gerçek zamanlı olarak yeniden flaş komutunun çıktısını yansıtmamaktadır görünüyor - bu yürütme güncelleştirme komutu dönene kadar hiçbir şey göstermek gibi görünüyor. Ben burada neler olup bittiğini görmek için daha fazla test yapmak gerekir.

Ben eriştiğiniz Edit 3: Boşver, bu dosyanın is geçerli gibi görünüyor. Çekirdek kaynak JFFS2 görüntü depolandığı bölümün benim kullanımı ile tetiklenen bazı JFFS2 ilgili görevleri yaptım ise sadece bir gecikme isabet oldu. Nedenini bilmiyorum, ama bu görünüşte bitti kadar bütün PHP betikleri engellemek neden olur.

Bu geçici bir çözüm için, ben ayrı bir komut güncelleme komut çağırma koyacaktım ve Ajax ile bunu talep ediyorum - teknik olarak hala sistem üzerinde beklerken bu şekilde, kullanıcının en azından bazı paketlenmiş geribildirim alırsınız.

0 Cevap