在php编程中,笔者想到能不能用php来执行shell脚本语言(PHP调用LINUX命令的功能),然后通过LAMP将执行结果通过网页显示或者存入数据库。在以前的文章中剖析Pi-Dashboard的机制 是将数组$D里面的数值是通过文件读取写入数组和php的函数赋值的,这是有一定局限性的。对于有些数据可能只有shell才能方便快捷的处理。
搜索引擎找了一下,果然是有的。shell_exec函数,通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。那么这个函数就将架起php和shell之间的桥梁,十分方便,可以做到事半功倍。
那笔者就来测试一番。新建个shelltest.php。
<?php
echo shell_exec('ls');
?>
php shelltest.php执行脚本,脚本前面的php可不能少,不然shelltest.php找不到执行程序。
在树莓派实验室找了个高阶版本-显示树莓派状态信息的PHP页面,可以执行shell脚本语言来查看实时的树莓派状态信息。在/var/www/html文件夹(得安装apache/nginx+php)中新建shell.php脚本,将下面的代码写入脚本中。
<?php
/**
* state
*
* @package custom
*/
?>
<article class="content">
<section class="post">
<div id='server_state'>
<h5>uname -a</h5>
<pre><?php echoshell_exec("uname -a"); ?></pre><br/>
<h5>Uptime</h5>
<pre><?php echoltrim(shell_exec("uptime"), " "); ?></pre><br/>
<h5>cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq </h5>
<pre>
<?php
$t= shell_exec("cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq");
echosprintf("%s/1000=%sKHz", str_replace("\n", "", $t), $t/1000);
?>
</pre><br/>
<h5>cat /sys/class/thermal/thermal_zone0/temp </h5>
<pre>
<?php
$t= shell_exec("cat /sys/class/thermal/thermal_zone0/temp");
echosprintf("%s/1000=%sC°", str_replace("\n", "", $t), $t/1000);
?>
</pre><br/>
<h5>free -h</h5>
<pre><?php echoshell_exec("free -h"); ?></pre><br/>
<h5>cat /proc/cpuinfo</h5>
<pre><?php echoshell_exec("cat /proc/cpuinfo"); ?></pre>
</div>
在浏览器http://192.168.31.82/shell.php查看信息,不要太方便了。相比pi-dashboard的实现机制,shell_exec函数就是“一个支点翘起地球”。
在实践中笔者才知道PHP有三种方法来执行外部命令。一是提供4个专门的执行外部命令的函数:exec(), system(), passthru(), shell_exec() ,二是反撇号`(和~在同一个键)执行系统外部命令 ,三是popen()函数打开一个进程管道来执行给定的命令。具体的区别就不一一阐述了请参考文章PHP中调用外部命令的方法 。在这片文章中,有两个问题值得考虑:安全性和超时。安全模式不能执行外部程序,只有在特定目录中的外部程序才可以被执行,这个目录可以在php.ini 文件定义。当执行命令的返回结果非常庞大时,可以需要考虑将返回结果输出重定向至其他文件,再另行读取文件,这样可以显著提高程序执行的效率。
如果php要运行进程的话,那么shell_exec()函数可能不太实用,参考php手册说明:shell_exec()函数当进程执行过程中发生错误,或者进程不产生输出的情况下,都会返回NULL, 所以,使用本函数无法通过返回值检测进程是否成功执行。 如果需要检查进程执行的退出码,请使用exec()函数。
网友评论