注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

红尘若梦

生活的色彩

 
 
 

日志

 
 

PHP中调用系统命令  

2015-11-25 15:43:20|  分类: 技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
在写PHP程序时避免不了有需要调用系统命令的时刻,而PHP也提供了函数来执行,用好这些函数有能够起到很大的作用,但具体怎么调用更必须针对具体情况来分析。下面就来说说各个函数调用的具体适应场合【以WINDOW平台为例】:
1)直接执行,不需要获取命令行输出及结果,也不需要向命令输入。

<?php
echo `dir 593668`;
?>

省心省事,但必须注意下,要确保shell_exec函数可用,否则是无法使用这种反撇号执行系统外部命令的。 
2)需要获取命令行输出及执行结果。
a) 需要获取结果及执行的状态码,以便自行处理,请使用exec()。
原型: string exec ( string $command [, array &$output [, int &$return_var ]] ) 第二个参数,让其结果输出到指定的数组。此数组一个记录代表输出的一行。第三个参数用来取得命令执行的状态码,通常执行成功都是返回0。注意后两参数全是传址的,如果需要反复输出调用不同系统外部命令的结果,最好在输出每一条系统外部命令结果时清空这两个参数,以防混乱。不提交后两个参数,则返回结果的最后一行。

<?php
exec("dir 593668.com",$output,$result);
print_r($output);
?>

b) 需要获取结果直接输出到浏览器,请使用system()。 
原型: string system ( string $command [, int &$return_var ] )  如果执行命令成功则返回true,否则返回false。第二个参数用来取得命令执行的状态码,通常执行成功都是返回0。 

<?php
system("dir 593668.com");
?>

c) 需要获取结果且结果是二进制直接输出到浏览器,请使用passthru()。  
原型: void passthru ( string $command [, int &$return_var ] )  不返回任何值,且可以输出二进制,比如图像数据。 第二个参数用来取得命令执行的状态码,通常执行成功都是返回0。  

<?
header("Content-type:image/gif");
passthru("type 593668.com.gif");
?>

d)不需要获取执行的状态码,直接获取执行结果,请使用hell_exec()。
原型: string shell_exec ( string $cmd )  

<?php
$output = shell_exec('dir 593668.com');
echo "<pre>$output</pre>";
?>

3)要跟系统命令交互,有输入有输出。使用popen ()函数,打开一个进程管道来执行给定的命令,返回一个文件句柄,可以进行读和写操作。

<?php
/*输入例子*/
$command = "mysql -u root -p";
$pwd = "593668.com";
$fp = @popen($command ,"w");
@fputs($fp,$pwd);
@pclose($fp);
/*输出例子*/
$handle = @popen('dir 593668.com', 'r');
$read = fread($handle, 2096);
echo $read;
pclose($handle);
?>

在默认情况下,象system()等函数要等到这个命令运行完才返回(实际上是要等命令的输出结果),容易引起引起PHP脚本的超时。如果要执行的命令要花费很长的时间,那么应该把这个命令放到系统的后台去运行,且命令的输出重定向到另外一个文件或流中,所以相关的命令最好是形如:

<?php
//WINDOW
system("start /b dir 593668.com > NUL");
//LINUX
system("ls 593668.com > /tmp/null &");
?>

当然,在使用PHP调用系统命令行也请注意安全问题,在将命令提交时,请先使用EscapeShellCmd()和EscapeShellArg()过滤下。函数EscapeShellCmd是把一个字符串中会引起安全问题的特殊字符转义【在Shell中是有特殊含义的字符,象分号(;),重定向(>)和从文件读入 (<)等都会被转义】。函数EscapeShellArg是用来处理系统命令的参数的。会在给定的字符串两边加上单引号,并把字符串中的单引号转义,这样这个字符串就可以安全地作为命令的参数。
  评论这张
 
阅读(106)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017