PHP执行linux系统命令的常用函数使用说明


Posted in PHP onApril 27, 2010

system函数
说明:执行外部程序并显示输出资料。
语法:string system(string command, int [return_var]);
返回值: 字符串

详细介绍:
本函数就像是 C 语中的函数 system(),用来执行指令,并输出结果。若是 return_var 参数存在,则执行 command 之后的状态会填入 return_var 中。同样值得注意的是若需要处理用户输入的资料,而又要防止用户耍花招破解系统,则可以使用 EscapeShellCmd()。若 PHP 以模块式的执行,本函数会在每一行输出后自动更新 Web 服务器的输出缓冲暂存区。若需要完整的返回字符串,且不想经过不必要的其它中间的输出界面,可以使用 PassThru()。

实例代码:

< ?php 
$last_line = system('ls', $retval); 
echo 'Last line of the output: ' . $last_line; 
echo '<hr />Return value: ' . $retval; 
?>

exec函数
说明:执行外部程序。
语法:string exec(string command, string [array], int [return_var]);
返回值: 字符串

详细介绍:
本函数执行输入 command 的外部程序或外部指令。它的返回字符串只是外部程序执行后返回的最后一行;若需要完整的返回字符串,可以使用 PassThru() 这个函数。

要是参数 array 存在,command 会将 array 加到参数中执行,若不欲 array 被处理,可以在执行 exec() 之前呼叫 unset()。若是 return_var 跟 array 二个参数都存在,则执行 command 之后的状态会填入 return_var 中。

值得注意的是若需要处理使用者输入的资料,而又要防止使用者耍花招破解系统,则可以使用 EscapeShellCmd()。

实例代码:

< ?php 
echo exec('whoami'); 
?>

popen函数
说明:打开文件。
语法:int popen(string command, string mode);
返回值: 整数

详细介绍:
本函数执行指令开档,而该文件是用管道方式处理的文件。用本函数打开的文件只能是单向的 (只能读或只能写),而且一定要用 pclose() 关闭。在文件操作上可使用 fgets()、fgetss() 与 fputs()。若是开档发生错误,返回 false 值。

实例代码:

< ? 
$fp = popen("/bin/ls","r" ); 
?>

PHP监控linux服务器负载

在实际项目的应用中,我们由于各种条件的现实,利用PHP来实现服务器负载监控将是一种更为灵活的方式。

由于Web Server以及PHP的实现方式所限,我们在现实环境中很难利用PHP去调用一些Linux中需要root权限才能执行的程序,对此,我从网上找到另外一种方式来绕开这个限制。首先先写个c程序中转调用系统命令,然后用PHP去执行此c程序。

c程序

首先写个c文件,比如/usr/local/ismole/w.c

#include<stdio.h> 
#include<stdlib.h> 
#include<systypes.h> 
#include<unistd.h> int main() 
{ 
uid_t uid ,euid; 
//note 获得当前的uid 
uid = getuid(); 
//note 获得当前euid 
euid = geteuid(); 
//note 交换这两个id 
if(setreuid(euid, uid)) 
perror("setreuid"); 
//note 执行将要执行linux系统命令 
system("/usr/bin/w"); 
return0; 
}

编译该文件gcc -o w -Wall w.c,这时会在当前目录下生成程序w。改变此程序的属主chmod u+s ./w。
PHP执行

文件内容如下,放在web目录下,访问就会输出当前的服务器负载情况。

<?php 
/* 
More & Original PHP Framwork 
Copyright (c) 2007 - 2008 IsMole Inc. $Id: serverMonitor.php 408 2008-12-02 08:07:40Z kimi $ 
*/ 
//note key的验证过程 
if($key != $authkey) { 
// exit('key error); 
} 
$last_line = exec('/usr/local/ismole/w', $retval); 
$returnArray = explode("load average: ", $retval[0]); 
$returnString = $returnArray[1]; 
echo $returnString; 

 按照上面的实例,我们可以用PHP来做任何我们想执行的Linux系统命令,SVN更新,服务器监控,备份,恢复,日常维护等等。
PHP 相关文章推荐
谈谈新手如何学习PHP
Dec 23 PHP
随时给自己贴的图片加文字的php水印
Mar 16 PHP
PHP 观察者模式的实现代码
May 10 PHP
PHP错误提示的关闭方法详解
Jun 23 PHP
使用PHP接收POST数据,解析json数据
Jun 28 PHP
深入解读php中关于抽象(abstract)类和抽象方法的问题分析
Jan 03 PHP
php输出1000以内质数(素数)示例
Feb 16 PHP
浅谈php错误提示及查错方法
Jul 14 PHP
PHP中empty,isset,is_null用法和区别
Feb 19 PHP
浅谈ThinkPHP中initialize和construct的区别
Apr 01 PHP
php检测mysql表是否存在的方法小结
Jul 20 PHP
使用PHP+MySql实现微信投票功能实例代码
Sep 29 PHP
php 使用post,get的一种简洁方式
Apr 25 #PHP
Windows下安装Memcached的步骤说明
Apr 25 #PHP
PHP 文件缓存的性能测试
Apr 25 #PHP
PHP 中文处理技巧
Apr 25 #PHP
PHP 网络开发详解之远程文件包含漏洞
Apr 25 #PHP
php快速url重写更新版[需php 5.30以上]
Apr 25 #PHP
PHP CURL模拟GET及POST函数代码
Apr 25 #PHP
You might like
生成php程序的php代码
2008/04/07 PHP
php 中文和编码判断代码
2010/05/16 PHP
基于PHP Web开发MVC框架的Smarty使用说明
2013/04/19 PHP
ThinkPHP通过AJAX返回JSON的两种实现方法
2014/12/18 PHP
php语言的7种基本的排序方法
2020/12/28 PHP
PHP编写登录验证码功能 附调用方法
2016/05/19 PHP
PHP+Ajax 检测网络是否正常实例详解
2016/12/16 PHP
php生成网页桌面快捷方式
2017/05/05 PHP
运用Windows XP附带的Msicuu.exe、Msizap.exe来彻底卸载顽固程序
2007/04/21 Javascript
Jquery 表单取值赋值的一些基本操作
2009/10/11 Javascript
jquery.artwl.thickbox.js  一个非常简单好用的jQuery弹出层插件
2012/03/01 Javascript
多个js与css文件的合并方法详细说明
2012/12/26 Javascript
jquery bind(click)传参让列表中每行绑定一个事件
2014/08/06 Javascript
微信小程序 scroll-view隐藏滚动条详解
2017/01/16 Javascript
jQuery EasyUI 组件加上“清除”功能实例详解
2017/04/11 jQuery
JavaScript中最常用的10种代码简写技巧总结
2017/06/28 Javascript
基于mpvue的小程序项目搭建的步骤
2018/05/22 Javascript
微信小程序实现省市区三级地址选择
2020/06/21 Javascript
原生JS实现留言板功能
2020/02/08 Javascript
JavaScript实现动态生成表格
2020/08/02 Javascript
jQuery实现可以计算进制转换的计算器
2020/10/19 jQuery
Python内置加密模块用法解析
2019/11/25 Python
在pycharm中关掉ipython console/PyDev操作
2020/06/09 Python
Virtualenv 搭建 Py项目运行环境的教程详解
2020/06/22 Python
详解css3自定义滚动条样式写法
2017/12/25 HTML / CSS
HTML5对比HTML4的主要改变和改进总结
2016/05/27 HTML / CSS
挪威手表购物网站:Klokker
2016/09/19 全球购物
经典大学生求职信范文
2014/01/06 职场文书
幼儿园教师获奖感言
2014/03/11 职场文书
服务整改报告
2014/11/06 职场文书
2014年学生工作总结
2014/11/20 职场文书
Oracle11g R2 安装教程完整版
2021/06/04 Oracle
Redis Cluster 集群搭建你会吗
2021/08/04 Redis
Python使用PyYAML库读写yaml文件的方法
2022/04/06 Python
阿里云k8s服务升级时502错误 springboot项目应用
2022/04/09 Servers
解决Vmware虚拟机安装centos8报错“Section %Packages Does Not End With %End. Pane Is Dead”
2022/06/01 Servers