专栏首页编程乐园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用来保存命令执行的状态码(用来检测成功或失败)。

例子:

<?php

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 环境执行命令,并且将完整的输出以字符串的方式返回。

例子:

<?php

$output = shell_exec('whoami');

echo "$output"; // hedong

exit;

注意:

当进程执行过程中发生错误,或者进程不产生输出的情况下,都会返回 NULL, 所以,使用本函数无法通过返回值检测进程是否成功执行。 如果需要检查进程执行的退出码,请使用 exec() 函数。

system() 函数

原型:string system ( string command [, int &return_var] )

描述:执行给定的命令,返回最后的输出结果;第二个参数是可选的,用来得到命令执行后的状态码。

例子:

<?php

system("whoami", $status); // 直接输出

var_dump($status); // 成功时状态码是 0

exit;

输出结果:hedong

passthru() 函数

原型:void passthru (string command [, int return_var])

描述:执行给定的命令,但不返回任何输出结果,而是直接输出到显示设备上;第二个参数可选,用来得到命令执行后的状态码。

用途:当所执行的 Unix 命令输出二进制数据, 并且需要直接传送到浏览器的时候, 需要用此函数来替代 exec() 或 system() 函数

例子:

<?php

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类似,但是可以提供双向管道。

例子:

<?php

/**

// 管道配置

$descriptors = array(

0 => array("pipe", "r"),

1 => array("pipe", "w")

);

$process = proc_open("php", $descriptors, $pipes);

if (is_resource($process)) {

fwrite($pipes[0], "<?phpn");

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程序设计有所帮助。

原文链接:https://www.blog.zirun.me/php/4643.html

我来说两句

0 条评论
登录 后参与评论

相关文章

  • PHP程序守护进程化实现方法详解

    一般Server程序都是运行在系统后台,这与普通的交互式命令行程序有很大的区别。glibc里有一个函数daemon。调用此函数,就可使当前进程脱离终端变成一个守...

    砸漏
  • Python运行外部程序的几种方法

    ShellExecute(hwnd,op,file,params,dir,bShow) - hwnd:父窗口的句柄,若没有则为0 - op:要进行的操作...

    py3study
  • 小程序如何引入外部字体(方法详解)

    honey缘木鱼
  • 详解SSH 远程执行任务的方法

    SSH 是 Linux 下进行远程连接的基本工具,但是如果仅仅用它来登录那可是太浪费啦!SSH 命令可是完成远程操作的神器啊,借助它我们可以把很多的远程操作自动...

    砸漏
  • PHP生成器(generator)和协程的实现方法详解

    本文实例讲述了PHP生成器(generator)和协程的实现方法。分享给大家供大家参考,具体如下:

    用户8664418
  • php-fpm重启导致的程序执行中断问题详解

    在 05:28:01这个时间有人给php-fpm 发送了SIGTERM信号,在这个点发生很可能是个定时任务, 确认果然是这样 28 5 * * * root /...

    砸漏
  • golang实现php里的serialize()和unserialize()序列和反序列方法详解

    Golang 实现 PHP里的 serialize() 、 unserialize()

    砸漏
  • golang实现php里的serialize()和unserialize()序列和反序列方法详解

    Golang 实现 PHP里的 serialize() 、 unserialize()

    用户8832582
  • PHP实现函数内修改外部变量值的方法示例

    本文实例讲述了PHP实现函数内修改外部变量值的方法。分享给大家供大家参考,具体如下:

    砸漏
  • 详解PHP实现定时任务的五种方法

    定时运行任务对于一个网站来说,是一个比较重要的任务,比如定时发布文档,定时清理垃圾信息等,现在的网站大多数都是采用PHP动态语言开发的,而对于PHP的实现决定了...

    Lanson
  • PHP实现单条sql执行多个数据的insert语句方法

    以上这篇PHP实现单条sql执行多个数据的insert语句方法就是小编分享给大家的全部内容了,希望能给大家一个参考。

    砸漏
  • Linux 创建子进程执行任务的实现方法

    Linux 操作系统紧紧依赖进程创建来满足用户的需求。例如,只要用户输入一条命令,shell 进程就创建一个新进程,新进程运行 shell 的另一个拷贝并执行用...

    砸漏
  • PHP中的自动加载操作实现方法详解

    或许你已经对自动加载有所了解。简单描述一下:自动加载就是我们在new一个class的时候,不需要手动去写require来导入这个class.php文件,程序自动...

    砸漏
  • PHP使用ActiveMQ实现消息队列的方法详解

    本文实例讲述了PHP使用ActiveMQ实现消息队列的方法。分享给大家供大家参考,具体如下:

    砸漏
  • PHP实现基于回溯法求解迷宫问题的方法详解

    本文实例讲述了PHP实现基于回溯法求解迷宫问题的方法。分享给大家供大家参考,具体如下: 引言 最近在leetcode上看了/【一个开发人员,能懂服务器量好,反之...

    用户2323866
  • 带你了解控制线程执行顺序的几种方法

    通常情况下,线程的执行顺序都是随机的,哪个获取到CPU的时间片,哪个就获得执行的机会。不过实际的项目中有时我们会有需要不同的线程顺序执行的需求。借助一些java...

    用户7634691
  • golang实现php里的serialize()和unserialize()序列和反序列办法详解

    Golang 实现 PHP里的 serialize() 、 unserialize()

    砸漏
  • PHP内部实现打乱字符串顺序函数str_shuffle的方法

    今天聊的是字符串顺序打乱函数str_shuffle。这个函数本身使用频率并不高。但是,其内部实现还是非常有趣的。

    砸漏
  • Android Studio 中运行 groovy 程序的方法图文详解

    Groovy是一种基于JVM(Java虚拟机)的敏捷开发语言,它结合了Python、Ruby和Smalltalk的许多强大的特性,Groovy 代码能够与 Ja...

    砸漏

扫码关注云+社区

领取腾讯云代金券