Exec çıkışı () baskılayarak PHP çağırır

4 Cevap

I exec() vb, hizmetleri yeniden başlatmayı MySQL timezone dosyaları yükleme gibi görevleri gerçekleştirmek için kullanabileceğiniz PHP komut satırı komut bir dizi var iken exec () kendisi bazı ekrana çıktı değil bir şey yok Ben kullanıyorum komutları ben bastırmak için görünmüyor olabilir çıkışı (hatta ob_start ile () / ob_end_clean ()) zorluyor. Örneğin, aşağıdaki MySQL içine timezone dosyalarını yüklemek istiyorum. Biz emin MySQLs dilimi verileri güncel olduğundan emin olmak için periyodik olarak bu çalıştırın:

 $command = 'mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql';
 exec($command, $output, $result);

Bu örnekte, komut tüm çıkış $ çıkış içine yazılmış olması beklenir, ama ben yine ekrana zorla aşağıdaki çıktıyı alıyorum:

Warning: Unable to load '/usr/share/zoneinfo/Asia/Riyadh87' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/Asia/Riyadh88' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/Asia/Riyadh89' as time zone. Skipping it.
...

Bu çıktıyı bastırmak için herhangi bir yolu var mı? Bu PHP tamamlamak için komut beklemeden işleme devam etmek için neden olacak gibi / dev / null yönlendiriliyorsunuz ideal değildir.

Thanks in advance,
~ JamesArmes

4 Cevap

Işlemin gerçekleştiği yer yalnız stderr'yi yönlendiriliyor sadece & eklemek için değil emin olun, etkilememelidir. Eğer çıktıyı yönlendirmek ve arka planda çalışan yaparsanız sadece arka planda çalışması gerekir.

Edit:

Açık cygwin kırık, bu bir denemek, ilk komuta stderr'yi yönlendirmek gerekir:

$command = 'mysql_tzinfo_to_sql /usr/share/zoneinfo 2> /dev/null | mysql mysql';
exec($command, $output, $result);

Sadece stderr /dev/null yönlendirmek

$command = 'mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql 2>/dev/null';

ya da stdout

$command = 'mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql 2>&1';

/ Dev / null yönlendiriliyorsunuz not neden PHP komut bekliyor durdurmak için yapar. Ekleme bir son & genellikle bir yönlendirme ile birlikte kullanılır, çünkü & does Bunu, muhtemelen iki ilişkilendirmek.

Yannick adlı (silindi) yorumuna cevaben: Eğer PHP arka planda bir şey çalıştırmak istiyorsanız, must yönlendirme gibi & kullanarak görünüyor. This does not mean that redirection alone causes it to run in the background.

Göre http://us3.php.net/manual/en/function.shell-exec.php, bir değişkene bu komutun çıktısını atayabilirsiniz.

Mutlaka etkili çıktı bastırmak anlamına gelir değişkeni ile bir şey yapmak zorunda değilsiniz.

Umarım ki olur!