最近写了一个命令行脚本,涉及 composer 安装的几个库,还有自己封装的四五个类。不希望把一堆 php 脚本 拷来拷去,最好能像 phpunit 那样就直接封装成一个可执行的文件。phpunit 的做法是把所有相关文件打包封装到一个 phar 包里去分发,我也可以这么干。
首先配置 php.ini 里的
,默认 Php 解释器对 phar 是只读访问的,不能修改 phar 的内容,以免意外修改整体交付的软件包。修改配置之后才可以用来打包生成 phar。改好配置之后,建立程序目录结构如下:
- phar.readonly=0
- .
- ├── bin
- ├── generate-phar.php
- └── src
- └── index.php
其中 src 目录里有完整的代码文件,包括 composer 引入的第三方库。我们用 generate-phar.php 程序生成 phar 文件,并把它放到 bin 目录里去。
- <?php
- //在bin目录下创建phar文件
- $phar = new Phar(__DIR__ . DIRECTORY_SEPARATOR . 'bin/mytool.phar');
- //从src目录构建phar包
- $phar->buildFromDirectory('src');
- //定义默认执行入口为index.php
- $defStub = Phar::createDefaultStub('index.php');
- //设置php解释器shell头,让phar可以自己执行
- $phar->setStub("#!/usr/bin/env php\n$defStub");
- //用bzip2库压缩phar包里的文件(此步要求PHP安装了zlib和bz2扩展,可以跳过)
- $phar->compressFiles(Phar::BZ2);
- //将phar包改名,去掉phar扩展名
- rename('bin/mytool.phar', 'bin/mytool');
- //授予phar包可执行权限
- chmod('bin/mytool', 0755);
现在可以用
直接执行包中的程序了,phar 会自动使用系统中安装的 PHP 解释器,如果想在任意目录运行此程序,可以把 phar 包拷到
- bin/mytool
路径覆盖的目录中,比如
- $PATH
。
- /usr/local/bin
来源: http://www.tuicool.com/articles/2Uji2yV