用PHP执行外部程序方法的详细说明
本文说明了用PHP执行外部程序的方法。分享给大家参考,如下:
在一些特殊情况下,PHP会被用来调用外部程序执行,比如调用shell命令、shell脚本、可执行程序等。今天,我了解了PHP在源代码中执行外部程序的方法,并借此机会顺便整理了一下。
在源代码的exec.h文件中,列出了几个可以调用外部程序的函数。蓝框中的两个功能只是辅助功能。本文只介绍其他几个功能。
先决条件
1 PHP没有在安全模式下运行,所以关闭安全模式,即safe_mode=off
2禁用功能列表disable _ functions=exec、system、shell _ exec、proc _ open、popen,如果禁用,则将其关闭。
注意:执行外部程序是有风险的,所以这些功能要在保证安全的情况下使用。
Exec()函数
原型:string exec (string命令[,数组输出[,int return _ var]])
描述:返回值保存最终的输出结果,所有的输出结果都会保存到$output数组中。$return_var用于保存命令执行的状态代码(用于检测成功或失败)。
示例:
?phpexec('whoami ',$output,$ status);var _ dump($ output);退出;输出结果:
数组(1) {[0]=字符串(7)'河东' }注意:
(1)输出结果将逐行追加到$output中,因此在调用exec之前需要unset($output ),尤其是循环调用时。
如果想在通过exec调用外部程序后立即继续执行后续代码,在命令中添加“”是不够的。此时,exec仍将等待命令执行;有必要重定向标准输出,如exec ('ls-al/dev/null ',$ output,$ var);
Shell_exec()函数
原型:字符串shell_exec(字符串命令)
描述:通过shell环境执行命令,并以字符串形式返回完整的输出。
示例:
?PHP $ output=shell _ exec(' whoami ');echo ' $ output//hedongexit;注意:
当流程执行过程中出现错误或流程没有产生输出时,将返回空值。因此,不可能通过使用该功能来检测进程是否成功执行。如果需要检查进程执行的退出代码,请使用exec()函数。
系统()功能
原型:stringsystem (stringcommand [,int return _ var])
描述:执行给定的命令,返回最终的输出结果;第二个参数是可选的,用于在命令执行后获取状态代码。
示例:
?phpsystem('whoami ',$ status);//直接输出var _ dump($ status);//成功时状态码为0退出;输出:河东
Passthru()函数
原型:void passthru(字符串命令[,int return _ var])
描述:执行给定的命令,但不返回任何输出结果,而是直接输出到显示设备;第二个参数是可选的,用于在命令执行后获取状态代码。
用途:当执行的Unix命令输出二进制数据,需要直接传输到浏览器时,需要使用这个函数代替exec()或system()函数
示例:
?phppassthru('whoami ',$ status);//直接输出var _ dump($ status);//成功时状态码为0退出;输出:河东
Popen()函数
原型:资源Popen(字符串命令,字符串模式)
描述:打开一个管道,指向执行给定命令生成的进程。返回与fopen()相同的文件指针,只是它是单向的(只能用于读取或写入),并且必须用pclose()关闭。该指针可用于fgets()、fgetss()和fwrite()。
示例:
$fd=popen('command ',' r ');$ ret=fgets($ FD);注意:只能打开单向管道,可以是“r”或“w”;并且需要使用pclose()来关闭。
Proc_open()函数
原型:resourceproc _ open(字符串cmd,数组描述符规范,数组管道[,字符串CWD [,数组env [,数组other _ options]])
描述:类似于popen,但可以提供双向管道。
示例:
?PHP/* * * @ Author : Hedong * @ Date2017-04-04 *///Pipeline配置$ descriptors=array(0=array(' pipe ',' r '),1=array ('pipe ',' w ')));$process=proc_open('php ',$ descriptors,$ pipes);if(is _ resource($ process)){ fwrite($ pipes[0],'?PHP \ n ');fwrite($pipes[0],' \$rand=rand(1,2);\ n ');fwrite($pipes[0],‘if(\ $ rand==1)\ { n’);fwrite($pipes[0],' echo ' Hello,World!\ n \ ';\ n ');fwrite($pipes[0],' } else { ');fwrite($pipes[0],' echo '再见,世界!\ n \ ';\ n ');fwrite($pipes[0],“}”);fwrite($pipes[0],'?');fc lose($ pipes[0]);$ output=while(!feof($ pipes[1]){ $ output。=fgets($ pipes[1]);} $ output=strtopher($ output);echo $输出;fc lose($ pipes[1]);proc _ close($ process);}输出结果:
再见,世界!
注意:
如果是管道类型,使用proc_close()关闭资源,使用pclose()关闭句柄。proc _ open打开的程序是php的一个子流程,php退出后该子流程将退出。
总结:
exec函数保存第二个参数的输出结果;
shell_exec函数在参数中没有接收到返回值,也没有成功执行的状态代码。
系统函数直接输出执行结果;Passthru函数与系统函数相同,区别在于它适用于处理输出的二进制数据;
popen函数将分叉一个子进程并返回一个文件指针
proc_open函数与popen相同,但可以提供双向通道
更多对PHP相关内容感兴趣的读者可以查看本网站专题:《PHP进程与线程操作技巧总结》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《PHP数据结构与算法教程》、《php程序设计算法总结》、《PHP数学运算技巧总结》、《php正则表达式用法总结》、0103010
希望本文对PHP编程有所帮助。
版权声明:用PHP执行外部程序方法的详细说明是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。