php命令行工具开发

原创
2017/12/25 22:38
阅读数 292

只要把php.exe所在的目录添加到环境变量中,就可以在任意目录下使用:

php test.php

执行一个当前目录下的test.php中的代码,通过这种方式,可以方便地用php来开发一些工具,但是有些限制:

1. 必须在某个目录下执行这个命令:比如 php test.php 命令,必须是test.php在当前目录下才行;

2. 需要通过php 命令来执行,而不是自定义的命令

要解决这个问题,就需要在命令行中直接命令,让它可以在任意目录下直接通过命令行的命令执行 test.php中的代码,当然还要能接受参数,不然功能就太单一了。

在 windows 环境下,很多工具都是 带有 .exe 的可执行文件,然后把可执行文件所在目录添加到环境变量中;比如 php命令就是把 php.exe 所在的目录添加到环境变量中,mysql也是把mysql.exe所在目录添加到环境变量。但 php 并不能生成 .exe 文件,怎么办呢?

先来看一下 linux 环境下怎样用 php 开发命令行工具:

1. 创建 php 脚本文件:

//文件所在:/home/me/test.php

<?php

echo "I am test.php \n";

 

2. 创建 test 命令行脚本文件

 php /home/my/test.php 

 

3. 把 test 文件 复制到 /usr/bin/ 目录下

sudo cp test /usr/bin/test

 

4. 授权 test 为可执行文件:

cd /test/bin

sudo chmod +X test

如果不行,则:

sudo chmod 777 test

 

5. 测试:

在任意目录下执行:test

应该能看到: I am test.php 的字符串,这是 test.php 的 php 脚本打印的内容。

 

也就是说这时你可以在任意目录下通过自定义的 test 命令执行自己写在 test.php 中的程序。

想开发命令行的小工具,只需要把代码写到 test.php 中就好了。

 

当然,其实前三步可以合并成一步:

直接在/usr/bin 创建一个test 的文件,内容为:

#!/usr/bin/php
<?php
echo "I am test.php \n";

然后授权,测试即可。

 

 

在 windows 环境下其实也是类似的过程,网上搜了很久没有找到相关的内容,但 composer 给了我启发,因为它就是一个用 php 开发的命令行工具,安装后就可以直接在 cmd 中使用 composer 命令了,于是我找到了它的文件。

参考 composer 后,我发现 windows 开发命令行工具其实也是很简单的:

1. 借助批处理文件来执行 php 程序:

 linux 下的shell 脚本一般保存为 .sh ,但 linux 并没有强制要求加文件后缀,比如我前面举例的 test 文件一般会命名为 test.sh ,但因为要作为一个可执行文件所以直接去掉了 .sh 的后缀。

 windows 环境下的命令行脚本(也要批处理文件) 一般命名为 .bat 或 .cmd ,可以在不使用文件后缀的时候直接调用,像 .exe 文件一样。

比如在当前目录下有个 a.exe 的文件,我们可以在命令行直接通过 a 来执行;同样如果有个 b.bat 或 b.cmd 的文件,也可以通过 b 来执行它。

假如有个 test.php 的 php 文件,则在该目录下建一个 test.cmd 的文件,内容为:

php test.php

在命令行中输入 test 即可看到 test.php 执行的结果;如果没有 test.cmd 这个文件,只有 test.php 的话,是不能通过率 test 命令来执行 test.php 的。

 

2. 把 test.php 所在的目录添加到一样变量中:

 要让程序成为一个使用方便的工具,就要在任意目录下都能使用,所以要添加环境变量,不能只能在 test.php所在的目录下行能使用。

 

3. 优化 test.cmd 文件:

@echo OFF

php %~dp0test.php %*

 

 第一行的 @echo off (大小写都可以) 可以让小黑窗不显示 test.cmd 中的命令

而 test.php 前面的 %~dp0 表示test.php 所在的目录,不能换成 %cd ,因为后者表示的是小黑窗当前所以的目录,而当前所在的目录下可能没有 test.php 这个文件。

而后面的 %* 表示接收任意的参数,如果不能的话,你的 test.php 就不能接收参数了,这样这个工具的功能也就变得很单一了。

cmd 中通过%1 %2 ....来接收参数,而当参数个数不确定时,直接用 %* 就可以搞定。

 

4. 在 test.php 中获取命令行的参数:

 php 中获取命令行参数的方式有两种:

1)$argv //只能在全局作用域中使用,在函数内不能使用

2)$_SERVER['argv'] //可在所有作用域内使用,包括函数体内

很明显第二种好用,命令行的参数是用空格来区分的,连接的多个空格当一个,使用过命令行工具的人应该知道命令行传参的格式并没有统一,一般有三种:

 1) cmd param1 param2 //命令行直接传参,多个参数的时候按顺序来定义参数

 2) cmd -param1 p1 -param2 p2  //每个参数有名称,参数名前面加单横线,空格后就是对应的参数值

 3) cmd --param1 p1 --param2 p2  //每个参数有名称,参数名前面加两个横线,空格后是对应的参数值

我个人比较喜欢第二种

在 test.php 中通过自定义一个获取参数的函数:

function get_argv($key=false){

if(!$key){return false;}

$key="-".$key;

$argv=$_SERVER['argv'];

$count=count($argv);

for($i=0;$i<$count;$i++){

if($key==$argv[$i]&&$i<$count-1){return $argv[$i+1];}

}

return false;

}

 

这样,windows 环境下用 php 开发命令行工具的架子就搭好了,想做什么只需要在 test.php 中去实现就好了,如果有多个文件,除了用 include 外,还可以打包成 phar 文件,比如 composer 就是这么做的。

 

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部