← 返回文章列表

PHP打包为phar

简介

phar的作用类似与java的jar,可以将php代码打包成为一个文件,即phar文件。这个phar文件可以想php文件一样执行,别的php文件也可以用phar文件流的形式来调用其中的文件。

打包项目

对于一个项目pro,其中包含文件如下:

pro/proClass.php
pro/index.php
pro/other.php
createPhar.php

普通的按照以下的方式打包,在php.ini中设置phar.readonly = Off,通过createPhar.php文件:

<?php
$phar = new Phar('pro.phar' , FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::KEY_AS_FILENAME , 'pro.phar');
$phar->buildFromDirectory(dirname(__FILE__) . '/pro/');

运行php createPhar.php将会生成pro.phar文件。

其中new phar(),第一个参数为生成phar的路径位置,第二个参数为文件访问方式,第三位参数为phar相关别名,用于phar://包含方式中的关键名。

使用phar

在一般的php脚本中,直接包含phar文件,即:

include 'pro.phar';

会自动执行pro.phar中包含的index.php,若不存在index.php,php会报错。

通过phar://方式包含文件,如:

include 'phar://path/to/pro.phar/other.php';
//or
include 'phar://pro.phar/other.php';

将会只包含other.php文件。

打包phar自执行文件

类似composer之类的phar文件,能够将文件移动到/usr/local/bin等目录,直接在shell中执行composer。这类phar有特殊的打包方法。

同样有pro项目,如:

pro/proClass.php
pro/index.php
pro/other.php
createPhar.php

createPhar.php文件内容:

<?php
$stub = <<<SSS
#!/usr/bin/env php
<?php
Phar::mapPhar();
include 'phar://pro.phar/index.php';
__HALT_COMPILER();
SSS;

$phar = new Phar('pro.phar' , FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::KEY_AS_FILENAME , 'pro.phar');
$phar->buildFromDirectory(dirname(__FILE__) . '/pro/');
$phar->setStub($stub);

其中,->setStub()方法设置phar被调用时执行的代码,即执行$stub对应脚本内容。

#!/usr/bin/env php绑定shell环境执行脚本;

Phar::mapPhar()将当前文档所属phar映射到某个phar别名上,无参数即自身的别名(这里是pro.phar);

include 'phar://pro.phar/index.php'为包含代码;

__HALT_COMPILER()为中断编译,停止接下来的执行。