这篇文章主要介绍了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实现执行外部程序的方法详解相关推荐

  1. php timer 定时执行,PHP定时执行任务实现方法详解(Timer),详解timer_PHP教程

    PHP定时执行任务实现方法详解(Timer),详解timer 下面通过理论讲解,实例分析,效果展示的方式给大家分享下PHP定时执行任务实现方法. 定时器任务,在WEB应用比较常见,如何使用PHP实现定 ...

  2. Leetcode怎么调试java代码,IDEA2020.1使用LeetCode插件运行并调试本地样例的方法详解...

    环境: idea2020.1 插件: LeetCode-editor 6.7 一.IDEA安装LeetCode插件 安装完成重启idea 打开插件 URL可以选择国服和世界服.LoginName和Pa ...

  3. 计算机软件与程序没有任何关系,该文件没有程序与之关联来执行操作解决方法详解...

    现在,我们经常会使用电脑进行学习.工作和娱乐.但是,在使用电脑的过程中我们会遇到各种各样的问题,例如该文件没有程序与之关联来执行操作.有时候当我们想打开文件的时候,会有这样子的提示.然后,我们就不可以 ...

  4. sudo: apt-get:找不到命令_Linux重复执行历史命令方法详解

    Linux 下,如果要执行一条或多条之前输过的指令,要怎么处理?很多人会想到使用上下箭头去翻查历史输入的命令.这当然是可以了,除了这种方法,本文再介绍另外 5 种方法来实现这样的效果. 在正式开始之前 ...

  5. phpyun怎么采集_php采集神器cURL使用方法详解

    对于做过数据采集的人来说,cURL一定不会陌生.虽然在PHP中有file_get_contents函数可以获取远程链接的数据,但是它的可控制性太差了,对于各种复杂情况的采集情景,file_get_co ...

  6. php mysql连续签到跨月_PHP连续签到功能实现方法详解

    本文实例讲述了PHP连续签到功能实现方法.分享给大家供大家参考,具体如下: require "./global.php"; $act = isset($_GET['act']) ? ...

  7. python的执行过程_在交互式环境中执行Python程序过程详解

    前言 相信接触过Python的伙伴们都知道运行Python脚本程序的方式有多种,目前主要的方式有:交互式环境运行.命令行窗口运行.开发工具上运行等,其中在不同的操作平台上还互不相同.今天,小编讲些Py ...

  8. docker exec执行多个命令详解

    2019独角兽企业重金招聘Python工程师标准>>> docker exec执行多个命令详解 2018年04月23日 22:46:24 阅读数:6928 标签: dockercon ...

  9. python3.6.6卸载_Python3.6安装卸载、执行命令、执行py文件的方法详解

    Python3.6安装卸载.执行命令.执行py文件的方法详解 开发一个功能,C/C++可能要500行代码,Java可能需要200行代码,然而Python可能需要50行代码,虽然代码少,可能开发的飞起, ...

最新文章

  1. linux服务器oracle数据库导出dmp文件功能演示,备份数据库命令。exp命令显示command not found解决方法,EXP-00028: 无法打开dmp进行写入问题解决
  2. JavaScript——易班优课YOOC课群在线测试自动答题解决方案(五)简单插件
  3. 索尼首款 AI 图像传感器,让相机处处更智能
  4. 使用.NET Core MVC Web应用程序中的ResponseCache属性处理缓存
  5. python的xlwt库的作用_Python:使用第三方库xlwt来写Excel
  6. Delphi窗体显示Echarts图表
  7. 用js内置对象XMLHttpRequest 来用ajax
  8. 在Winform中实现半透明遮罩层
  9. warcraft3Viewer模型导入到3dsmax到Unity
  10. POJ 2706 Connect
  11. Ae:文本动画制作器
  12. Android S 新特性:应用行为更改
  13. tritonserver的metrics参数说明
  14. Latex文本两端对齐
  15. creat a secret folder
  16. git创建使用1https://blog.csdn.net/Hanani_Jia/article/details/77950594
  17. 最小二乘法拟合圆公式推导及vc实现
  18. HTML5七夕情人节表白网页(幻化3D相册) HTML+CSS+JavaScript 求婚示爱代码 520情人节告白代码 程序员表白源码 3D旋转相册 js烟花代码 css爱心表白
  19. mysql导入bak文件
  20. 深度强化学习+金融投资的应用入门

热门文章

  1. 江苏小高考计算机知识点,江苏小高考知识点
  2. mysql 两列计数_MySQL在两列上计算唯一值,并为每列连接这些计数
  3. linux操作普通文件夹,Linux学习--2.文件管理的基本命令
  4. 每日一皮:爸爸你听我解释...
  5. Java中的微信支付(2):API V3 微信平台证书的获取与刷新
  6. 树莓派基于 Linux 的 Windows XP 现已可用
  7. Spring Boot如何优雅的校验参数
  8. 为什么面试官总喜欢问String?
  9. 深入理解 RPC : 基于 Python 自建分布式高并发 RPC 服务
  10. 中国式微服务技术栈2.0