PHP启动windows应用程序、执行bat批处理、执行cmd命令的方法(exec、system函数详解)


Posted in PHP onOctober 20, 2014

exec 或者 system 都可以调用cmd 的命令

直接上代码:

<?php

/** 打开windows的计算器 */

exec('start C:WindowsSystem32calc.exe');
/** php生成windows的批处理文件后,再执行这个批处理文件*/

$filename = 't.bat';

$somecontent = 'C:

';

$somecontent .= 'cd "C:/Program Files/MySQL-Front"';

$somecontent .= '

start MySQL-Front.exe';

if (!$handle = fopen($filename, 'w')) {

 echo "不能打开文件 $filename";

 exit;

}
/** 首先我们要确定文件存在并且可写*/

if (is_writable($filename)) {
 /** 那就是当我们使用fwrite()的时候,$somecontent将要写入的地方

  将$somecontent写入到我们打开的文件中 。*/

 if (fwrite($handle, $somecontent) === FALSE) {

  echo "不能写入到文件 $filename";

  exit;

 }

 echo "成功地将 $somecontent 写入到文件 $filename";

 fclose($handle);

} else {

 echo "文件 $filename 不可写";

}

exec($filename);

?>

有一个遗留问题,就是exec()调用,php会一直执行,直到你关闭启动的应用程序,这样会造成php执行超时,不知道怎么解决这个问题,希望高手路过此地,留下答案!我日后解决了,也会更新到这里的!

以下来自资料

=================================================

php的内置函数exec,system都可以调用系统命令(shell命令),当然还有passthru,escapeshellcmd等函数。

在很多时候利用php的exec,system等函数调用系统命令可以帮助我们更好更快的完成工作。

注意:要想使用这二个函数 php.ini 中的安全模式必须关闭,要不然为了安全起见php是不让调用系统命令的。

先看一下php手册对这二个函数的解释:

exec --- 执行外部程式

语法 : string exec ( string command [, array &output [, int &return_var]] )

说明 :
exec()执行给予的命令command,不过它并不会输出任何东西,它简单的从命令的结果中传回最后一行,如果你需要去执行一个命令,并且从命令去取得所有资料时,可以使用passthru()这个函数。
如果有给予参数array,则指定的数组将会被命令所输出的每一行填满,注意 : 如果数组先前已经包含了一些元素的话,exec()将会把它附加在数组的后面,如果你不想要此函数附加元素的话,你可以在传递此数组给exec()之前呼叫unset()。
如果有给予参数array和return_var,则传回执行的状态命令将会写到这个变量。

注意: 如果你允许来自使用者输入的资料,可以传递到此函数,那么你应该使用escapeshellcmd( )来确定此使用者无法哄骗(trick)系统来执行武断的(arbitrary)命令。

注意: 如果你使用此函数来启动一个程式,而且希望在背景里(background)执行的时候离开它,你必须确定此程式的输出是转向(redirected)到一个文件或是一些输出的资料流,否则PHP将会悬挂(hang)直到程式执行结束。

system --- 执行外部程式并且显示输出

语法:string system ( string command [, int &return_var] )

说明:

system( )执行给予的命令command,并且输出结果。如果有给予参数return_var,则执行命令的状态码将会写到这个变量。

注意: 如果你允许来自使用者输入的资料,可以传递到此函数,那么你应该使用escapeshellcmd( )来确定此使用者无法哄骗(trick)系统来执行武断的(arbitrary)命令。

注意: 如果你使用此函数来启动一个程式,而且希望在背景里(background)执行的时候离开它,你必须确定此程式的输出是转向(redirected)到一个文件或是一些输出的资料流,否则PHP将会悬挂(hang)直到程式执行结束。
如果PHP是运作成伺服器模组,在输出每一行后,system( )会试着自动地清除web伺服器的输出缓冲。

成功则传回命令的最后一行,失败则传回false。

如果你需要去执行一个命令,并且从命令去取得所有资料时,可以使用passthru( )这个函数。

这二个都是用来调用系统shell命令,

不同点:

exec可以把执行的结果全部返回到$output函数里(数组),$status是执行的状态 0为成功 1为失败

systerm不需要提供$output函数,他是直接把结果返回出来,同样$return_var是执行的状态码 0为成功 1为失败

exec示例:

<?php

 $a = exec("dir", $out, $status);

 print_r($a);

 print_r($out);

 print_r($status);

?>

system示例:
<?php

 $a = system("dir", $status);

 print_r($a);

 print_r($status);

?>

上面说明看起来有点乱,运行两个例子后,你就会明白的!

【system】

<?php

set_time_limit(0);

define('ROOT_PATH', dirname(__FILE__));
include ROOT_PATH . '/include/global.func.php';
$cmdTest = 'ps -ef | grep magent';
$lastLine = system($cmdTest, $retVal);
write_log('$lastLine');

write_log($lastLine);
write_log('$retVal');

write_log($retVal);

?>

输出:

++++++++++++++++++++++++++++++++++++++++++

2014-10-15 16:28:52

$lastLine

++++++++++++++++++++++++++++++++++++++++++

2014-10-15 16:28:52

root      5375  5373  0 16:28 pts/1    00:00:00 grep magent

++++++++++++++++++++++++++++++++++++++++++

2014-10-15 16:28:52

$retVal

++++++++++++++++++++++++++++++++++++++++++

2014-10-15 16:28:52

0

【exec】

<?php

set_time_limit(0);

define('ROOT_PATH', dirname(__FILE__));
include ROOT_PATH . '/include/global.func.php';
$cmdTest = 'ps -ef | grep magent';
$lastLine = exec($cmdTest, $output, $retVal);
write_log('$lastLine');

write_log($lastLine);
write_log('$output');

write_log($output);
write_log('$retVal');

write_log($retVal);

?>

输出:

++++++++++++++++++++++++++++++++++++++++++

2014-10-15 16:25:00

$lastLine

++++++++++++++++++++++++++++++++++++++++++

2014-10-15 16:25:00

root      5360  5358  0 16:25 pts/1    00:00:00 grep magent

++++++++++++++++++++++++++++++++++++++++++

2014-10-15 16:25:00

$output

++++++++++++++++++++++++++++++++++++++++++

2014-10-15 16:25:00

Array

(

    [0] => root      2838     1  0 15:39 ?        00:00:00 magent -u root -n 51200 -l 192.168.137.100 -p 12001 -s 192.168.137.100:11211 -b 192.168.137.100:11212

    [1] => root      5358  5356  0 16:25 pts/1    00:00:00 sh -c ps -ef | grep magent

    [2] => root      5360  5358  0 16:25 pts/1    00:00:00 grep magent

)
++++++++++++++++++++++++++++++++++++++++++

2014-10-15 16:25:00

$retVal

++++++++++++++++++++++++++++++++++++++++++

2014-10-15 16:25:00

0

结论:

如果需要详细的输出结果,那就用exec()吧!我一般用exec()执行外部命令!

参考:

http://php.net/manual/zh/function.system.php
http://php.net/manual/zh/function.exec.php

PHP 相关文章推荐
调整优化您的LAMP应用程序的5种简单方法
Jun 26 PHP
Yii入门教程之目录结构、入口文件及路由设置
Nov 25 PHP
通过php添加xml文档内容的方法
Jan 23 PHP
使用php-timeit估计php函数的执行时间
Sep 06 PHP
PHP+Mysql+jQuery查询和列表框选择操作实例讲解
Oct 22 PHP
php开发工具有哪五款
Nov 09 PHP
老生常谈PHP面向对象之命令模式(必看篇)
May 24 PHP
Yii2 如何在modules中添加验证码的方法
Jun 19 PHP
CI框架附属类用法分析
Dec 26 PHP
PHP7修改的函数
Mar 09 PHP
PHP7 windows支持
Mar 09 PHP
php实例化对象的实例方法
Nov 17 PHP
php实现删除指定目录下相关文件的方法
Oct 20 #PHP
PHP中加密解密函数与DES加密解密实例
Oct 17 #PHP
php实现过滤表单提交中html标签的方法
Oct 17 #PHP
php生成xml时添加CDATA标签的方法
Oct 17 #PHP
php输出xml必须header的解决方法
Oct 17 #PHP
php生成百度sitemap站点地图类函数实例
Oct 17 #PHP
php+mysql实现数据库随机重排实例
Oct 17 #PHP
You might like
PHP 数据结构 算法描述 冒泡排序 bubble sort
2011/07/10 PHP
php 启动时报错的简单解决方法
2014/01/27 PHP
服务器上配置PHP运行环境教程
2015/02/12 PHP
php语言中使用json的技巧及json的实现代码详解
2015/10/27 PHP
jQuery UI-Draggable 参数集合
2010/01/10 Javascript
不要在cookie中使用特殊字符的原因分析
2010/07/13 Javascript
JavaScript中的排序算法代码
2011/02/22 Javascript
关于JAVASCRIPT urldecode URL解码的问题
2012/01/08 Javascript
javascript scrollTop正解使用方法
2013/11/14 Javascript
jquery插件开发之实现jquery手风琴功能分享
2014/03/10 Javascript
node.js中的http.response.addTrailers方法使用说明
2014/12/14 Javascript
jQuery实现视频作为全屏幕背景
2014/12/18 Javascript
JS+CSS实现鼠标滑过时动态翻滚的导航条效果
2015/09/24 Javascript
JavaScript字符串删除重复字符的方法
2015/12/25 Javascript
[原创]jQuery常用的4种加载方式分析
2016/07/25 Javascript
对js eval()函数的一些见解
2016/08/15 Javascript
jQuery与JavaScript节点创建方法的对比
2016/11/18 Javascript
Bootstarp 基础教程之表单部分实例代码
2017/02/03 Javascript
jQuery窗口拖动功能的实现代码
2017/02/04 Javascript
bootstrap datetimepicker 日期插件在火狐下出现一条报错信息的原因分析及解决办法
2017/03/08 Javascript
JavaScript中在光标处插入添加文本标签节点的详细方法
2017/03/22 Javascript
判断滚动条滑到底部触发事件(实例讲解)
2017/11/15 Javascript
Vue的路由动态重定向和导航守卫实例
2018/03/17 Javascript
对vue中methods互相调用的方法详解
2018/08/30 Javascript
vuex actions异步修改状态的实例详解
2019/11/06 Javascript
解决vue项目本地启动时无法携带cookie的问题
2021/02/06 Vue.js
pyqt5 禁止窗口最大化和禁止窗口拉伸的方法
2019/06/18 Python
Python二维数组实现求出3*3矩阵对角线元素的和示例
2019/11/29 Python
python实现mean-shift聚类算法
2020/06/10 Python
Django封装交互接口代码
2020/07/12 Python
python 实现数据库中数据添加、查询与更新的示例代码
2020/12/07 Python
Tommy Hilfiger澳洲官网:美国高端休闲领导品牌
2020/12/16 全球购物
生产部经理岗位职责
2013/12/16 职场文书
2014年大班元旦活动方案
2014/02/26 职场文书
学雷锋感言
2015/08/03 职场文书
银行客户经理培训心得体会
2016/01/09 职场文书