这篇文章主要介绍了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. 微博遭鹿晗恋情暴击瘫痪,如何快速提高系统性能?
  2. linux如何建立隐藏目录,【Linux】文件与目录的默认权限与隐藏权限
  3. jquery复选框组清空选中的值_防火墙基本配置:配置策略组
  4. 笨笨工作室告别十月模拟赛
  5. 还敢吹「毫无PS痕迹」?小心被Adobe官方AI打脸
  6. ArrayList详细
  7. 电机学(1) - 绪论
  8. 如何编写python代码
  9. MySQL — 数据库的基本概念、安装并配置MySQL、MySQL的基本使用、在项目中操作MySQL、前后端的身份认证
  10. 软件推荐(6):滴答清单
  11. 王绍伟:你不是非得和别人一样---转载
  12. ZLIB 压缩的数据格式规范
  13. Abaqus怎么关闭和显示节点单元编号
  14. java框架2019_Java回顾#2 – 2019年最佳工具,框架和功能
  15. 简单容易的计算机音乐,简单易上手的小型音乐制作软件 1BITDRAGON 升级 2.0
  16. Windows程序设计--击键消息和字符消息
  17. Iphone开发(一)基础知识
  18. 不确定性下的判断:启发法和偏见
  19. golang channel
  20. 数据结构和算法-无权无向图

热门文章

  1. shell softech 面料_跨越三分之一个世纪的软壳神话
  2. linux无法挂载移动硬盘6,FC6下挂载NTFS移动硬盘,无法读取
  3. 如何实现Word、PDF,TXT文件的全文内容检索?
  4. 快速搭建Java 17环境并玩转Record特性
  5. 如果女朋友突然问你DNS是个啥...
  6. 通宵加班、猝死频发,但仍建议你不要轻易买保险
  7. 一篇文章,带你了解 “机器学习工程师” 必备技能图谱
  8. MLP多层感知机 学习笔记
  9. paddleocr win10 编译
  10. 深度学习框架 通道顺序