Neden Aşağıdaki php kod beklenen değerleri dönen değil?

6 Cevap php

Ben sistem, üst ve diğer özel komut gibi komutlar çağırır, diğer şeyler arasında çalışacak bir kaç php komut yapmak için çalışıyorum. Aşağıdaki kodu süper basit olduğunu görebilirsiniz. Aşağıda php ile yaşıyorsanız sorun olduğunu ben böyle linux isteminden php çağırdığınızda:

#php checkTOP.php

Bu ekranın üst-n 1 çıkışını hiçbir sorun dönecektir.

Ben kullanarak web sunucusu komut dosyasını çalıştırdığınızda http://url.com/checkTOP.php sadece aşağıdaki döndürür:

program:/usr/bin/top -n 1 ver1 = retval = 1 Returned not zero

Hangi benim hata ayıklama ifadeleri olduğunu.

<?php
        $program="/usr/bin/top -n 1";
        echo "program:{$program}<br /> \n";
        $ver1=system($program,$retval);
        echo "ver1 = {$ver1}<br />\n";
        echo "retval = {$retval}<br /> \n";
        if($retval==0)
        {
                echo "Returned 0<br />\n";
        }
        else
        {
                echo "Returned not zero <br />\n";
        }
        die;
?>

Değişim 1: Bir şey daha. Rxrxrx ile apache ve ayrıca tüm dizinleri / usr / bin: Tüm izinleri / usr / bin / üst kök ayarlamak doğru şekilde ayarlanır.

6 Cevap

Ole beni yendi; Ben onu göndeririz yüzden çıktı tamponlama kullandı:

<?PHP
ob_start();
$program="/usr/bin/top -n 1 -b";
passthru($program);
$t=ob_get_contents();
ob_end_clean();
echo "<PRE>$t</PRE>"; ?>

Üst çıkış almak için tek yolu toplu modunda üst çalıştırın ve hat başına bir eleman içeren bir dizi çıktı almak için exec () kullanmak için anahtarı-b göndermektir.

<?php
exec('/usr/bin/top -n 1 -b',$output);
echo '<pre>',implode("\n",$output),'</pre>';

Sistem fonksiyonu döner başarısız ve retval bu durumda muhtemelen boş gibi görünüyor.

Eğer sistem komutu alınamıyor Eğer exec kullanarak deneyebilirsiniz ve eğer o inşaat bakın. Ayrıca size istediğiniz her şeyi geri verecek ve ben think ayrıca Sorunu gidermenize yardımcı olmak bir hata mesajı döndürür:

http://us3.php.net/manual/en/function.exec.php

Üst komut normalde stdout çıkışını göndermek değildir. Sen sistem komutu ile yakalayamazsınız. "Toplu modunda" için üst-b seçeneğini kullanın ve sizin için çalışması gerekir.

$program="/usr/bin/top -b -n 1";

Eğer linux isteminden çalıştırdığınızda çalışıyor gibi çıktı ekrana gider çünkü görünüyor. Ben denedim, ben çıkış oldukça ben yankı komutları beklediğim maç olmadığını fark ettim. Oradaki çıkışı hakkında garip bir şey oldu ve üst için man sayfasına bir çek-b bayrağı doğruladı beni ihbar budur.

--
bmb

Kullanıcı hesapları ile ilgili bir sorun var gibi geliyor. Elle komut satırından çalıştırdığınızda web sunucusu olarak çalıştırmayı dener daha, muhtemelen farklı bir kullanıcı altında çalışan ediyoruz.

Kontrol etmek için bazı şeyler:

  • Safe Mode PHP için etkindir?
  • web sunucusu (genellikle "www-data") altında çalışır yürütmek için kullanıcı izni var top?
  • Eğer açabilirsiniz bir daha fazla bilgi alabilirsiniz error reporting level görmek için daha yüksek?

Eğer sistem toplamak istediğiniz bilgilere bağlı olarak, / proc / dosya sistemi toplamak için daha yararlı ve kesinlikle daha güvenli olabilir.

Ne komut almak için çalışıyoruz?