PHP有system、exec、passthru、eval 這些函數可以將系統執行的結果輸出,我們想要把結果貼到網頁上。
i.php
system("ping -c 1 211.75.194.243");
執行
# php i.php
PING 211.75.194.243 (211.75.194.243) 56(84) bytes of data.
64 bytes from 211.75.194.243: icmp_seq=1 ttl=64 time=0.059 ms
--- 211.75.194.243 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.059/0.059/0.059/0.000 ms
結果:
PING 211.75.194.243 (211.75.194.243) 56(84) bytes of data.
64 bytes from 211.75.194.243: icmp_seq=1 ttl=64 time=0.059 ms
--- 211.75.194.243 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.059/0.059/0.059/0.000 ms
如果要用PHP呼叫要把結果用變數取回,會發現困難,因為有些系統函數本身就會出輸結果,例如上面的 ping
我們想企圖利用變數來接system傳回的值,因為它只會取回最後一行的結果,同時也會把system本身的內容輸出。假如想用nl2br來解決也是無用,因為system本身早就把結果輸出了。
$a= system("ping -c 1 163.17.40.1"); echo "a=". $a;
結果:
PING 211.75.194.243 (211.75.194.243) 56(84) bytes of data.
64 bytes from 211.75.194.243: icmp_seq=1 ttl=64 time=0.059 ms
--- 211.75.194.243 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.059/0.059/0.059/0.000 ms
a=rtt min/avg/max/mdev = 0.059/0.059/0.059/0.000 ms
使用中介檔來解決
有一些方法可以解決這個問題,就是利用一個中介檔案
先讓結果輸出到中介檔,再讀取,這樣的好處就是不會輸出到螢幕上。
$file = "/tmp/postfixstatus"; system("ping -c 1 211.75.194.243 > $file"); // 把結果輸出到一個中介檔 $data = file_get_contents($file); // php5以上可以使用這個函數來替代fopen。 echo nl2br($data);
原文 2012-01-30 17:14:30