当前位置: 首页 > 后端技术 > PHP

PHP执行外部程序的方法

时间:2023-03-29 23:00:06 PHP

在一些特殊情况下,PHP会调用外部程序执行,例如:调用shell命令、shell脚本、可执行程序等。今天学习了PHP执行外部程序源码方法中,趁此机会顺便梳理一下。在源代码中的exec.h文件中,列出了几个可以调用外部程序的函数。蓝框内的两个功能只是辅助功能。本文仅介绍其他几个功能。前提1PHP没有运行在安全模式下,关闭安全模式,即:safe_mode=off2Disablefunctionlistdisable_functions=exec,system,shell_exec,proc_open,popen,如果禁用,则关闭。注意:执行外部程序有风险,请在确保安全的情况下使用这些功能。exec()函数原型:stringexec(stringcommand[,array&output[,int&return_var]])描述:返回值保存最终的输出结果,所有输出结果都会保存到$output数组中,$return_var为用于保存命令执行的状态码(用于检测成功或失败)。例子:string(7)"hedong"}注意:①输出结果会逐行追加到$output,所以在调用exec之前需要unset($output),尤其是在循环调用的时候。②如果想在通过exec调用外部程序后立即继续执行后续代码,仅仅在命令中加上“&”是不够的。这时候exec还是会等待命令被执行;您需要重定向标准输出,例如:exec("ls-al>/dev/null&",$output,$var);shell_exec()函数原型:stringshell_exec(stringcommand)描述:通过shell环境执行命令,并将完整的输出结果作为字符串return输出。示例:array("pipe","r"),1=>array("pipe","w"));$process=proc_open("php",$descriptors,$pipes);if(is_resource($process)){fwrite($pipes[0],"");fclose($管道[0]);$输出=“”;while(!feof($pipes[1])){$output.=fgets($pipes[1]);}$output=strtoupper($output);回声$输出;fclose($管道[1]);proc_close($process);}//输出结果:再见,世界!注意:①后面需要用proc_close()关闭资源,如果是管道类型,需要用pclose()关闭句柄。②proc_open打开的程序作为php的子进程,php退出后子进程也会退出。总结:exec函数将输出结果保存在第二个参数中;shell_exec函数没有收到参数中的返回值,也没有执行成功的状态码;系统函数直接输出执行结果;passthru函数与系统函数相同,区别在于它适用于处理输出的二进制数据;popen函数将派生一个子进程并返回一个文件指针。proc_open函数与popen相同,但它可以提供双向通道。关注我的公众号,一起成长推荐阅读:PHP多进程编程