php 运行外部程序_PHP实现执行外部程序的方法详解
这篇文章主要介绍了PHP实现执行外部程序的方法,结合实例形式分析了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 command [, array &output [, int &return_var]] )
描述:返回值保存最后的输出结果,而所有输出结果将会保存到$output数组,$return_var用来保存命令执行的状态码(用来检测成功或失败)。
例子:
exec('whoami',$output, $status);
var_dump($output);
exit;
输出结果:
array(1) {
[0]=>
string(7) "hedong"
}
注意:
① 输出结果会逐行追加到$output中,因此在调用exec之前需要unset($output),特别是循环调用的时候。
② 如果想通过exec调用外部程序后马上继续执行后续代码,仅仅在命令里加"&"是不够的,此时exec依然会等待命令执行完毕;需要再将标准输出做重定向才可以,例如:exec("ls -al >/dev/null &", $output, $var);
shell_exec() 函数
原型:string shell_exec( string command)
描述:通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。
例子:
$output = shell_exec('whoami');
echo "$output"; // hedong
exit;
注意:
当进程执行过程中发生错误,或者进程不产生输出的情况下,都会返回 NULL, 所以,使用本函数无法通过返回值检测进程是否成功执行。 如果需要检查进程执行的退出码,请使用 exec() 函数。
system() 函数
原型:string system ( string command [, int &return_var] )
描述:执行给定的命令,返回最后的输出结果;第二个参数是可选的,用来得到命令执行后的状态码。
例子:
system("whoami", $status); // 直接输出
var_dump($status); // 成功时状态码是 0
exit;
输出结果:hedong
passthru() 函数
原型:void passthru (string command [, int return_var])
描述:执行给定的命令,但不返回任何输出结果,而是直接输出到显示设备上;第二个参数可选,用来得到命令执行后的状态码。
用途:当所执行的 Unix 命令输出二进制数据, 并且需要直接传送到浏览器的时候, 需要用此函数来替代 exec() 或 system() 函数
例子:
passthru("whoami", $status); // 直接输出
var_dump($status); // 成功时状态码是 0
exit;
输出结果:hedong
popen() 函数
原型:resource popen ( string command, string mode )
描述:打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生。 返回一个和 fopen() 所返回的相同的文件指针,只不过它是单向的(只能用于读或写)并且必须用 pclose() 来关闭。此指针可以用于 fgets(),fgetss() 和 fwrite()。
例子:
$fd = popen("command", 'r');
$ret = fgets($fd);
注意:只能打开单向管道,不是'r'就是'w';并且需要使用pclose()来关闭。
proc_open() 函数
原型:resource proc_open ( string cmd, array descriptorspec, array &pipes [, string cwd [, array env [, array other_options]]] )
描述:与popen类似,但是可以提供双向管道。
例子:
/**
* @author: hedong
* @date 2017-04-04
*/
// 管道配置
$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 \"Goodbye, World!\n\";\n");
fwrite($pipes[0], " }");
fwrite($pipes[0], "?>");
fclose($pipes[0]);
$output = "";
while (!feof($pipes[1])) {
$output .= fgets($pipes[1]);
}
$output = strtoupper($output);
echo $output; fclose($pipes[1]);
proc_close($process);
}
输出结果:
GOODBYE, WORLD!
注意:
① 后面需要使用proc_close()关闭资源,并且如果是pipe类型,需要用pclose()关闭句柄。
② proc_open打开的程序作为php的子进程,php退出后该子进程也会退出。
总结:
exec函数将输出结果保存在第二个参数上;
shell_exec函数没有参数中接收返回值,而且没有执行成功的状态码;
system函数将执行的结果直接输出;passthru函数同system函数,不同之处是适合处理输出二进制数据;
popen函数会fork一个子进程,返回文件指针
proc_open函数同popen,但可提供双向通道
相关推荐:
php 运行外部程序_PHP实现执行外部程序的方法详解相关推荐
- php timer 定时执行,PHP定时执行任务实现方法详解(Timer),详解timer_PHP教程
PHP定时执行任务实现方法详解(Timer),详解timer 下面通过理论讲解,实例分析,效果展示的方式给大家分享下PHP定时执行任务实现方法. 定时器任务,在WEB应用比较常见,如何使用PHP实现定 ...
- Leetcode怎么调试java代码,IDEA2020.1使用LeetCode插件运行并调试本地样例的方法详解...
环境: idea2020.1 插件: LeetCode-editor 6.7 一.IDEA安装LeetCode插件 安装完成重启idea 打开插件 URL可以选择国服和世界服.LoginName和Pa ...
- 计算机软件与程序没有任何关系,该文件没有程序与之关联来执行操作解决方法详解...
现在,我们经常会使用电脑进行学习.工作和娱乐.但是,在使用电脑的过程中我们会遇到各种各样的问题,例如该文件没有程序与之关联来执行操作.有时候当我们想打开文件的时候,会有这样子的提示.然后,我们就不可以 ...
- sudo: apt-get:找不到命令_Linux重复执行历史命令方法详解
Linux 下,如果要执行一条或多条之前输过的指令,要怎么处理?很多人会想到使用上下箭头去翻查历史输入的命令.这当然是可以了,除了这种方法,本文再介绍另外 5 种方法来实现这样的效果. 在正式开始之前 ...
- phpyun怎么采集_php采集神器cURL使用方法详解
对于做过数据采集的人来说,cURL一定不会陌生.虽然在PHP中有file_get_contents函数可以获取远程链接的数据,但是它的可控制性太差了,对于各种复杂情况的采集情景,file_get_co ...
- php mysql连续签到跨月_PHP连续签到功能实现方法详解
本文实例讲述了PHP连续签到功能实现方法.分享给大家供大家参考,具体如下: require "./global.php"; $act = isset($_GET['act']) ? ...
- python的执行过程_在交互式环境中执行Python程序过程详解
前言 相信接触过Python的伙伴们都知道运行Python脚本程序的方式有多种,目前主要的方式有:交互式环境运行.命令行窗口运行.开发工具上运行等,其中在不同的操作平台上还互不相同.今天,小编讲些Py ...
- docker exec执行多个命令详解
2019独角兽企业重金招聘Python工程师标准>>> docker exec执行多个命令详解 2018年04月23日 22:46:24 阅读数:6928 标签: dockercon ...
- python3.6.6卸载_Python3.6安装卸载、执行命令、执行py文件的方法详解
Python3.6安装卸载.执行命令.执行py文件的方法详解 开发一个功能,C/C++可能要500行代码,Java可能需要200行代码,然而Python可能需要50行代码,虽然代码少,可能开发的飞起, ...
最新文章
- linux服务器oracle数据库导出dmp文件功能演示,备份数据库命令。exp命令显示command not found解决方法,EXP-00028: 无法打开dmp进行写入问题解决
- JavaScript——易班优课YOOC课群在线测试自动答题解决方案(五)简单插件
- 索尼首款 AI 图像传感器,让相机处处更智能
- 使用.NET Core MVC Web应用程序中的ResponseCache属性处理缓存
- python的xlwt库的作用_Python:使用第三方库xlwt来写Excel
- Delphi窗体显示Echarts图表
- 用js内置对象XMLHttpRequest 来用ajax
- 在Winform中实现半透明遮罩层
- warcraft3Viewer模型导入到3dsmax到Unity
- POJ 2706 Connect
- Ae:文本动画制作器
- Android S 新特性:应用行为更改
- tritonserver的metrics参数说明
- Latex文本两端对齐
- creat a secret folder
- git创建使用1https://blog.csdn.net/Hanani_Jia/article/details/77950594
- 最小二乘法拟合圆公式推导及vc实现
- HTML5七夕情人节表白网页(幻化3D相册) HTML+CSS+JavaScript 求婚示爱代码 520情人节告白代码 程序员表白源码 3D旋转相册 js烟花代码 css爱心表白
- mysql导入bak文件
- 深度强化学习+金融投资的应用入门
热门文章
- 江苏小高考计算机知识点,江苏小高考知识点
- mysql 两列计数_MySQL在两列上计算唯一值,并为每列连接这些计数
- linux操作普通文件夹,Linux学习--2.文件管理的基本命令
- 每日一皮:爸爸你听我解释...
- Java中的微信支付(2):API V3 微信平台证书的获取与刷新
- 树莓派基于 Linux 的 Windows XP 现已可用
- Spring Boot如何优雅的校验参数
- 为什么面试官总喜欢问String?
- 深入理解 RPC : 基于 Python 自建分布式高并发 RPC 服务
- 中国式微服务技术栈2.0