煮酒听雨
首页
PHP
MYSQL
WEB
Linux
关于本站
登陆
注册
PHP执行外部程序函数 system 、exec 、passthru的区别
编辑时间:2019-07-28
编辑:忘尘
阅读:381
在PHP中调用外部命令中常用3个专门的执行外部命令的函数: - system() - -执行外部程序,并且显示输出 - exec() - -执行一个外部程序 - passthru() - - 执行外部程序并且显示原始输出 ####它们的区别: system() 输出并返回最后一行shell结果。 exec() 不输出结果,返回最后一行shell结果,但可将所有结果可以保存到一个返回的数组里面。 passthru() 有输出但不返回任何结果,只调用命令,它把命令的运行结果原样地直接输出到标准输出设备上。 <hr> ####1、system ---执行外部程序,并且显示输出 ``` system ( string $command [, int &$return_var ] ) ``` - $command 要执行的命令 - $return_var 命令执行后的返回状态,若值是`0`表示成功 > `返回值`:成功则返回命令输出结果的`最后一行`, 失败则返回 `false` 示例: ```php $res = system('ls -l',$return_val); var_dump($res); #返回命令输出的最后一行 var_dump($return_val); #返回状态值 #执行程序后界面会输出命令 "ls -l" 的返回结果 #total 172 #-rw-r--r-- 1 root root 90 Dec 13 15:26 system.php #-rw-r--r-- 1 root root 153946 Dec 25 2019 test.log #-rw-r--r-- 1 root root 154 Dec 25 2019 test.php #string(47) "-rw-r--r-- 1 root root 154 Dec 25 2019 test.php" #int(0) ``` >system函数会将结果直接进行输出 (注意:是直接输出区别于返回值),命令成功后返回输出的最后一行,失败返回FALSE <hr> #### 2、exec() - 执行一个外部程序 ``` exec ( string $command [, array &$output [, int &$return_var ]] ) ``` - $command 要执行的命令。 - $output 如果提供了 output 参数, 那么会用命令执行的输出填充此数组,` 每行输出填充数组中的一个元素`。 数组中的数据不包含行尾的空白字符,例如 \n 字符。 请注意,如果数组中已经包含了部分元素,exec() 函数会在数组末尾`追加`内容。如果你不想在数组末尾进行追加, 请在传入 exec() 函数之前 对数组使用 unset() 函数进行`重置`。 - $return_var 如果同时提供 output 和 return_var 参数, 命令执行后的返回状态会被写入到此变量。若值是`0`表示成功 >`返回值` 命令执行结果的最后一行内容。如果想要获取命令的输出内容, 请确保使用 output 参数。 使用小技巧: > 执行`command 2 > &1` exec不成功,调试方案一个技巧就是使用管道命令, 使用 `2 > &1`, 命令就会输出shell执行时的错误到$output变量, 输出该变量分析错误。 示例: ```php $res = exec('ls -l',$output,$return_val); var_dump($res); var_dump($output); var_dump($return_val); #结果: string(52) "-rw-r--r-- 1 root root 154 Dec 25 2019 test.php" array(7) { [0]=> string(9) "total 176" [1]=> string(52) "-rw-r--r-- 1 root root 109 Dec 13 15:51 exec.php" [2]=> string(54) "-rw-r--r-- 1 root root 90 Dec 13 15:26 system.php" [3]=> string(52) "-rw-r--r-- 1 root root 153946 Dec 25 2019 test.log" [4]=> string(52) "-rw-r--r-- 1 root root 154 Dec 25 2019 test.php" } int(0) ``` <hr> ####3、passthru — 执行外部程序并且显示原始输出 同 exec() 函数类似, passthru() 函数 也是用来执行外部命令(command)的。 当所执行的 Unix 命令输出二进制数据, 并且需要直接传送到浏览器的时候, 需要用此函数来替代 exec() 或 system() 函数。 ``` passthru ( string $command [, int &$return_var ] ) ``` - command 要执行的命令。 - return_var 如果提供 return_var 参数, Unix 命令的返回状态会被记录到此参数。若值是`0`表示成功 >`返回值` 没有返回值。 ```php $res = passthru('ls -l',$return_val); var_dump($res); var_dump($return_val); #结果: 显示原始输出,返回值为NULL, return_val值是0表示成功 total 180 -rw-r--r-- 1 root root 109 Dec 13 15:51 exec.php -rw-r--r-- 1 root root 92 Dec 13 16:01 passthru.php -rw-r--r-- 1 root root 90 Dec 13 15:26 system.php -rw-r--r-- 1 root root 153946 Dec 25 2019 test.log -rw-r--r-- 1 root root 154 Dec 25 2019 test.php NULL # $res int(0) #$return_val ``` 如果您不希望直接显示数据,则需要使用输出缓冲区 示例 ``` ob_start(); $res= passthru('ls -l',$return_val); $var = ob_get_contents(); ob_end_clean(); //Use this instead of ob_flush() var_dump($var); var_dump($res); var_dump($return_val); #结果 string(215) "total 184 -rw-r--r-- 1 root root 109 Dec 13 15:51 exec.php -rw-r--r-- 1 root root 92 Dec 13 16:01 passthru.php -rw-r--r-- 1 root root 90 Dec 13 15:26 system.php " NULL int(0) ``` <hr> ###避免超时 如果要执行的命令要花费很长的时间,那么应该把这个命令放到系统的后台去运行。但在默认情况下,象system()等函数要等到这个命令运行完才返回(实际上是要等命令的输出结果),这肯定会引起PHP脚本的超时。解决的办法是把命令的输出重定向到另外一个文件或流中,如: ``` system("/usr/local/bin/order_proc > /tmp/null &"); ```
来说两句吧
提交评论
最新评论
我的标签
函数
面试
REDIS
LNMP
验证
时间
JS
LINUX
CPA
常量
MYSQL
备份
微信
文件
压缩
优化
SVN
PHP
集合
数组
HTML
收藏
NGINX
配置
日志
性能
加密
下载
FORM
WEB
样式
SQL
表单
配置,面试,REDIS
编码
ARRAY
替换
截取
密码
版本
进程
定时
测试
事务
数据
权限
安全
防火墙
索引
设计模式
安全,面试
缓存
热文排行
LNMP状态管理命令
navicat for mysql 导入xlsx,
(置顶)开发中常用功能知识点笔记
(置顶)收藏优秀分享文章集合
PHP加密解密算法(Discuz!经典代码)
PHP 获取数组第一个元素或最后一个值
Nginx配置 nginx.conf 文件中常用配
MySQL错误日志 [Warning] IP ad
Redis持久化:快照(RDB)和AOF简解
浅析SQLmap
随机文章
友情链接
官方手册
thinkphp
php扩展
Linux命令
lnmp
PHP中文网
鸟哥Linux私房
Nginx中文文档
json格式化
Redis手册
composer中文文档
CentOS下载
流程图
VPN代理
菜鸟网
奇淼教程
首页
PHP
MYSQL
WEB
Linux
关于本站
登陆
注册