php 执行shell命令函数,获取服务器运行状态值
*近做到一个监测服务器运行状态相关的东西。需要通过php来调用shell命令来获取所需的信息。
下面就从获取服务器信息简单介绍一下这几个常用相关函数。

1、exec()
exec($command, array &output = null, &output = null, &return_var = null)有三个参数。执行给定的命令,但不输出结果,而是返回结果的*后一行。虽然它只返回命令结果的*后一行,但用第二个参数array 可以得到完整的结果,方法是把结果逐行追加到array的结尾处。所以如果array不是空的,在调用之前*好用unset()*它清掉。只有指定了第二 个参数时,才可以用第三个参数,用来取得命令执行的状态码。
举个栗子:

$out01 = exec(‘ls -l’);
exec(‘ls -l’,$arr);
echo ‘只读取结果的*后一行’.$out01.”\n”;
var_dump(‘以数组的形式返回所有的输出’.$arr);

结果:

/usr/bin/php /Users/tao/PhpSites/csdnBlog/shell/shell.php
只读取结果的*后一行-rw-r–r– 1 tao staff 576 Nov 20 14:14 shell.php
string(44) “以数组的形式返回所有的输出Array”
-rw-r–r– 1 tao staff 576 Nov 20 14:14 shell.php

2、shell_exec()
shell_exec($cmd)只有一个参数,它会获取$cdm执行之后所有的数据。
栗子1:

$connect_num = shell_exec(‘netstat -nat|grep -i “80”|wc -l’);//获取当前服务器的80端口连接数 connect_num的值就是后面linux命令执行之后的输出内容

栗子2:

$out02 = shell_exec(‘ls -l’);

结果:

shell_exec()获取所有的返回值
total 8
-rw-r–r– 1 tao staff 638 Nov 20 14:18 shell.php

exec()和exec_shell()的区别
In short; exec()只返回$cmd命令的*后一行,exec_shell()返回全部的数据,假设*终的命令只有一行,那就随便选择了。但是,exec()命令的后两个参数,让我们可以以数组的操作方式去操作得到的数据,在某些case下,应该比读exec_shell获的的文本的数据强吧。并且还有状态码的返回。应该有些用处吧orz

3、system()
4、popen()
popen函数的执行流程:
1、使用pipe系统调用创建一个管道
2、创建一个新的进程,将拷贝标准输入或者标准输出到文件描述符。
3、关闭pipe返回的文件描述符。
4、调用execve系统调用来执行命令。
5、关闭管道
popen($cmd,$status)是通过”管道”的机制,来创建一个进程,进而来执行$cmd命令的,$status是管道的两种状态,分别是”r”和”w”,而上面所说的命令只有”r”的方式,当执行完shell命令之后,popen的返回值是一个普通的标准I/O流,所以必须要用pclose()将其关闭。
P.S.数据流的基本概念:
数据流是一串连续不断的数据的集合,就象水管里的水流,在水管的一端一点一点地供水,而在水管的另一端看到的是一股连续不断的水流。
数据写入程序可以是一段一段地向数据流管道中写入数据,这些数据段会按先后顺序形成一个长的数据流。
对数据读取程序来说,看不到数据流在写入时的分段情况,每次可以读取其中的任意长度的数据,但只能先读取前面的数据后,再读取后面的数据。
不管写入时是将数据分多次写入,还是作为一个整体一次写入,读取时的效果都是完全一样的。
举个栗子:

//所有连接到本机80端口的IP地址和其连接数。80端口一般是用来处理HTTP网页请求
$fp = popen(‘netstat -plan|grep :80|awk {\’print $5\’}|cut -d: -f 1|sort|uniq -c|sort -nk 1′, “r”);
$online_num = 0;
while (!feof($fp)) {
if(!feof($fp)){
$online_num += 1;
}
}
pclose($fp);
“`
再举个栗子:
“`
//获取某一时刻系统cpu和内存使用情况
$fp = popen(‘top -b -n 2 | grep -E “^(%Cpu|KiB Mem|Tasks)”‘, “r”);
$rs = “”;
while (!feof($fp)) {
$rs .= fread($fp, 1024);
}
pclose($fp);

看起来是不是普通文件的读取操作相似,将fp当做操作文本时候的简单的句柄,然后进行对I/O的操作就OK了、、

in the end
还有很多php来操作linux命令和shell脚本的函数,例如system、passthru等等。