原地址:http://www.cppblog.com/amazon/archive/2011/12/01/161281.aspx
很多情况下需要php调用其他程序如shell命令、shell脚本、可执行程序等等,此时需要使用到诸如exec/system/popen/proc_open等函数,每种函数有各自适合使用的场景以及需要注意的地方。
前提:PHP没有运行在安全模式
如果PHP运行在安全模式下,那么在执行外部命令、打开文件、连接数据库、基于HTTP的认证这4个方面将会受到制约,可能在调用外部程序时无法获取预期的结果,此时需要设置特定目录,可以在php.ini中编辑safe_mode_exec_dir参数来指定。
1. exec
原型:string exec ( string command [, array &output [, int &return_var]] )
描述:返回值保存最后的输出结果,而所有输出结果将会保存到$output数组,$return_var用来保存命令执行的状态码(用来检测成功或失败)。
例子:$ret = exec("ls -al", $output, $var);
注意:
A. 输出结果会逐行追加到$output中,因此在调用exec之前需要unset($output),特别是循环调用的时候。
B. 如果想通过exec调用外部程序后马上继续执行后续代码,仅仅在命令里加"&"是不够的,此时exec依然会等待命令执行完毕;需要再将标准输出做重定向才可以,例如:exec("ls -al >/dev/null &", $output, $var);
C. 要学会善用EscapeShellCmd()和EscapeShellArg()。函数EscapeShellCmd把一个字符串 中所有可能瞒过Shell而去执行另外一个命令的字符转义。这些字符在Shell中是有特殊含义的,象分号(|),重定向(>)和从文件读入 (<)等。函数EscapeShellArg是用来处理命令的参数的。它在给定的字符串两边加上单引号,并把字符串中的单引号转义,这样这个字符串 就可以安全地作为命令的参数。
2. system
原型:string system ( string command [, int &return_var] )
描述:执行给定的命令,返回最后的输出结果;第二个参数是可选的,用来得到命令执行后的状态码。
例子:$ret = system("ls -al", $var);
注意:略。
3. passthru
原型:void passthru (string command [, int return_var])
描述:执行给定的命令,但不返回任何输出结果,而是直接输出到显示设备上;第二个参数可选,用来得到命令执行后的状态码。
例子:passthru("ls -al", $var);
注意:略。
4. popen
原型:resource popen ( string command, string mode )
描述:打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生。 返回一个和 fopen() 所返回的相同的文件指针,只不过它是单向的(只能用于读或写)并且必须用 pclose() 来关闭。此指针可以用于 fgets(),fgetss() 和 fwrite()。
例子:$fd = popen("command", 'r'); $ret = fgets($fd);
注意:只能打开单向管道,不是'r'就是'w';并且需要使用pclose()来关闭。
5. proc_open
原型:resource proc_open ( string cmd, array descriptorspec, array &pipes [, string cwd [, array env [, array other_options]]] )
描述:与popen类似,但是可以提供双向管道。具体的参数读者可以自己翻阅资料,比如该博客:http://hi.baidu.com/alex_wang58/blog/item/a28657de16fec55195ee372a.html。
注意:
A. 后面需要使用proc_close()关闭资源,并且如果是pipe类型,需要用pclose()关闭句柄。
B. proc_open打开的程序作为php的子进程,php退出后该子进程也会退出。
C. 笔者在使用的时候遇到获取外部程序输出阻塞的问题,也就是在例子中的fgets($pipes[1])语句阻塞了,无法继续进行。经过多方查证后发现,问题一般出在外部程序中,比如外部程序是C程序,使用fprintf(stdin, "**** \n");输出结果,此时需要加上fflush(stdout);才行,否则输出结果可能会暂留缓存中,无法真正输出,而php也就无法获取输出了。
例子:
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
相关推荐
总的来说,PHP调用ActiveX DLL涉及到跨语言的交互,需要理解COM组件的工作原理,以及PHP与VB之间的通信方式。正确配置和使用这些工具可以帮助我们在PHP中充分利用其他编程语言的能力,实现更复杂的功能。
在PHP中,有时候我们需要在脚本中调用外部程序,比如执行系统命令、shell脚本或可执行文件。本文将详细介绍几种PHP实现执行外部程序的方法,主要包括`exec()`、`shell_exec()`、`system()`、`passthru()`以及`popen...
在python的使用中,有时也不得不调用一下外部程序,那么如何调用外部程序: 首先,我们要启动python软件,使用的是python2.7的版本,具体如图: 在外部调用中主要要用到一个os标准模块,下面介绍一下关于os模块的...
在现代的Web应用程序开发中,有时需要在Web端与本地资源进行交互,比如调用操作系统中的exe可执行程序。这通常涉及到JavaScript与服务器端技术的结合,以实现客户端的间接调用。本知识点将深入探讨如何在Web端调用带...
### 经典代码:php调用函数 - 动态模块加载与扩展调用 #### 概述 在PHP中,存在一种特殊的函数`dl()`,它允许PHP动态地加载所需的外部模块,包括针对不同操作系统的特定库文件。本文将详细介绍`dl()`函数的基本...
它们都是PHP提供的用于在服务器上执行外部程序或命令行脚本的函数。在Windows系统中,这些函数通常依赖于`cmd.exe`(命令提示符)来运行外部程序。当PHP尝试通过这些函数启动一个进程时,它需要有执行`cmd.exe`的...
在本案例中,我们将讨论如何使用PHP调用`dsoframer.ocx`控件来实现在线编辑Excel文件。 `dsoframer.ocx`是一个ActiveX控件,它允许在Web环境中打开、查看和编辑Office文档,包括Excel工作簿。要使用这个控件,你...
本文将详细讲解如何解决PHP调用Linux命令权限不足的问题,以及相关的安全考虑。 问题背景: 假设我们有一个名为`yourcmd`的Linux程序,它需要高级权限才能正常运行。在CentOS 6.3系统上,PHP通过Apache服务器执行,...
在PHP编程中,有时我们需要与操作系统进行交互,执行外部程序或命令来完成特定任务。PHP提供了几个函数来实现这一目标,这些函数包括`system()`, `exec()`, `shell_exec()`, `passthru()`以及`popen()`。下面是对...
在Flash编程中,调用外部数据,特别是数组,是一个常用且重要的技巧。这使得我们可以将数据存储在外部文件中,从而提高程序的可维护性和灵活性。在这个文档中,我们将探讨如何在Flash中加载和处理从外部文件导入的...
PHP中调用Shell的方法主要涉及通过PHP脚本执行外部命令,从而达到与操作系统...综上所述,PHP调用Shell的方法虽然方便,但开发者必须兼顾功能的实现和安全性保障,合理配置PHP环境和谨慎编写代码是实现这一目标的关键。
在描述中提到的"PHP调用Google翻译的程序类文件",这个类通常会包含以下主要组成部分: 1. **配置参数**:包括API密钥(Key),这是使用Google API的凭证。你需要在Google Cloud Console中创建项目并启用翻译API,...
我们可以使用 `Process.Start()` 方法来启动外部应用程序或网页,并使用 C# 或 JavaScript 来编写脚本以调用外部应用程序。这些技术可以帮助我们扩展 Unity3D 的功能,并实现更多的交互式应用程序。
例如,`exec()`函数允许我们执行一个外部程序,并获取其输出: ```php exec('ffmpeg -i input.mp4 output.flv', $output, $return_var); ``` 这段代码将`input.mp4`文件转换为`output.flv`,并捕获了FFmpeg的输出...
当调用闭包时,它会打印出传入的参数和引用的外部变量的值。 在Laravel框架中,可以使用控制器方法来执行闭包,如下所示: ```php class TestController extends Controller { // 测试闭包传参及use使用外部变量 ...
调用相机和写入外部存储都需要在运行时请求相应的权限。 8. **错误处理**: 整个流程中,需要对可能出现的异常情况进行处理,例如相机应用未安装、用户拒绝权限、网络问题、服务器错误等,确保程序的健壮性。 ...
CGI(Common Gateway Interface)是一种标准,定义了Web服务器如何调用外部程序(CGI程序)来处理来自Web浏览器的请求。这种接口允许Web服务器扩展其功能,比如处理表单数据、数据库查询、与其他系统集成等。CGI程序...
根据提供的文档信息,本文将详细解析“20140207PHP01_PHP面向对象程序设计.pdf”中关于PHP面向对象程序设计的关键知识点。 ### 面向对象概念 面向对象编程(Object-Oriented Programming, OOP)是一种编程范式,它...