php中如何执行linux命令详解


Posted in PHP onNovember 06, 2018

前言

本文主要给大家介绍了关于在php中如何执行linux命令的相关内容,下面话不多说了,来一起看看详细的介绍吧

php如何执行某个命令 ,官方手册在这里

我们先从shell_exec来说

如何使用shell_exec在php里面执行shell命令

先来试一下,使用php执行某个shell命令,该命令是mkdir testdir。

<?php

$cmd = 'mkdir testdir';
shell_exec($cmd);

在这个php脚本执行之前,目录里面是这样子的:

php中如何执行linux命令详解

执行之后,目录里面是如下图所示,多了一个testdir文件夹,这是通过我们刚刚在php脚本里面执行shell命令生成的

php中如何执行linux命令详解

shell命令执行失败会如何?

假如说执行shell命令的时候出错了,后面的php代码还能运行吗?看下面这个例子,我要执行的命令是读取并运行test.sh这个文件里面的内容,但是这个文件实际是不存在的。

<?php

$cmd = 'source test.sh';

shell_exec($cmd);

print_r("---the end---\n");

它的打印结果是:

sh: line 0: source: test.sh: file not found
---the end---

可以从打印结果看到,即使运行某个shell命令的时候会出错,不会影响下面的php代码的执行。所以,如果shell命令执行失败了,我们也没办法用php的try-catch是捕获不到shell命令的错误。

就比如下面的代码,实际上catch不到shell命令的错误

<?php

$cmd = 'source test.sh';

try {

shell_exec($cmd);

print_r("---the end---\n");

} catch (Exception $e) {
echo 'error=' . $e->getMessage();
}

它的打印结果是:

sh: line 0: source: test.sh: file not found
---the end---

获取shell_exec的输出

看一下官方文档里面提过的shell_exec

php中如何执行linux命令详解

我们在第一个例子里面试一下

<?php

$cmd = 'mkdir testdir';
$ret = shell_exec($cmd);
var_dump($ret);

打印出来的结果是

NULL

所以,我想,上面这个应该是命令没有任何输出,换一个有输出的命令,如下面代码;

<?php

$cmd = 'echo $SHELL';
$ret = shell_exec($cmd);
var_dump($ret);

它的打印结果是:

string(10) "/bin/bash
"

所以,如果想要用php执行shell命令,并且知道到底执行成功还是失败,那么可以在这个shell命令的后面加上2>&1,把错误输出到标准输出。这样就可以判断是执行失败还是执行成功。示例如下:

<?php

$cmd = 'source test.sh 2>&1';

$ret = shell_exec($cmd);
if (empty(ret)) {
print_r("---success---\n");
} else {
print_r("---failed---\n");
}

print_r("---the end---\n");

当然,官方手册里面除了有shell_exec,还有其他的,比如说exec。

下面就来说说exec

exec方法的参数是这样的,$output是一个数组,$return_var是一个int型的值。$return_var是0的时候表示命令执行成功。

string exec ( string $command [, array &$output [, int &$return_var ]] )

看下面的示例代码:

<?php

$cmd = 'ls -l /home';
exec($cmd, $result, $var);
var_dump($result);
var_dump($var);

打印结果如下:

php中如何执行linux命令详解

再看一下system

这是system的函数说明,$return_var是0的时候表示命令执行成功。system函数的返回是命令的输出的最后一行的内容

string system ( string $command [, int &$return_var ] )

看下面的示例代码:

<?php

$cmd = 'mkdir testsystem';;

$lastline = system($cmd, $var);
var_dump($lastline);
var_dump($var);

打印结果为:

string(0) ""
int(0)

还有其他的,就暂时不介绍了

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
php 文件上传代码(限制jpg文件)
Jan 05 PHP
php中设置index.php文件为只读的方法
Feb 06 PHP
php调用google接口生成二维码示例
Apr 28 PHP
PHP处理Json字符串解码返回NULL的解决方法
Sep 01 PHP
php 伪造ip以及url来路信息方法汇总
Nov 25 PHP
PHP PDO fetch 模式各种参数的输出结果一览
Jan 07 PHP
LINUX下PHP程序实现WORD文件转化为PDF文件的方法
May 13 PHP
php实现贪吃蛇小游戏
Jul 26 PHP
详谈PHP面向对象中常用的关键字和魔术方法
Feb 04 PHP
浅谈PHP面向对象之访问者模式+组合模式
May 22 PHP
PHP错误提示It is not safe to rely on the system……的解决方法
Mar 25 PHP
tp5 实现列表数据根据状态排序
Oct 18 PHP
laravel中的一些简单实用功能
Nov 03 #PHP
详解在YII2框架中使用UEditor编辑器发布文章
Nov 02 #PHP
yii2 上传图片的示例代码
Nov 02 #PHP
yii2实现Ueditor百度编辑器的示例代码
Nov 02 #PHP
php 调用百度sms来发送短信的实现示例
Nov 02 #PHP
Linux下 php7安装redis的方法
Nov 01 #PHP
PHP结合Ffmpeg快速搭建流媒体服务的实践记录
Oct 31 #PHP
You might like
PHP内核介绍及扩展开发指南―基础知识
2011/09/11 PHP
深入extjs与php参数交互的详解
2013/06/25 PHP
php使用curl访问https示例分享
2014/01/17 PHP
yii框架通过控制台命令创建定时任务示例
2014/04/30 PHP
PHP中的print_r 与 var_dump 输出数组
2016/06/13 PHP
document.all还是document.getElementsByName?
2006/07/21 Javascript
Javascript学习笔记9 prototype封装继承
2010/01/11 Javascript
javascript实现控制的多级下拉菜单
2015/07/05 Javascript
js+canvas简单绘制圆圈的方法
2016/01/28 Javascript
全面解析JavaScript中apply和call以及bind(推荐)
2016/06/15 Javascript
Vuex之理解Mutations的用法实例
2017/04/19 Javascript
原生JS获取元素的位置与尺寸实现方法
2017/10/18 Javascript
vue自定义指令directive实例详解
2018/01/17 Javascript
AngularJS日期格式化常见操作实例分析
2018/05/17 Javascript
基于js实现复制内容到操作系统粘贴板过程解析
2019/10/11 Javascript
原生js拖拽实现图形伸缩效果
2020/02/10 Javascript
[01:32]DOTA2次级联赛——首支职业女子战队选拔赛全记录
2014/10/23 DOTA
[47:42]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[01:11:02]Secret vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python中urllib2模块的8个使用细节分享
2015/01/01 Python
selenium+python截图不成功的解决方法
2019/01/30 Python
浅谈Django2.0 加xadmin踩的坑
2019/11/15 Python
详解从Django Allauth中进行登录改造小结
2019/12/18 Python
IntelliJ 中配置 Anaconda的过程图解
2020/06/01 Python
德国高性价比网上药店:medpex
2017/07/09 全球购物
朗仕(Lab series)英国官网:雅诗兰黛集团男士专属护肤品牌
2017/11/28 全球购物
法国票务网站:Ticketmaster法国
2018/07/09 全球购物
Nisbets法国:英国最大的厨房和餐饮设备供应商
2019/03/18 全球购物
Python里面如何拷贝一个对象
2014/02/17 面试题
医校毕业生自我鉴定
2014/01/25 职场文书
员工拓展培训方案
2014/02/15 职场文书
校园元旦活动总结
2014/07/09 职场文书
2014年残疾人工作总结
2014/12/06 职场文书
小学见习报告
2015/06/23 职场文书
感谢师恩主题班会
2015/08/17 职场文书
某学校的2019年度工作报告范本
2019/10/11 职场文书