刚开始php工作时,Boss要我研究一下关于PHP加密部署的问题,但是当时对PHP只是初步了解。后来换了一份工作,才知道可以使用phar包发布,可以算是加密发布的一种。

PHP Archive

PHP5.3之后支持了类似Java的jar包,名为phar。用来将多个PHP文件打包为一个文件。

如何创建phar包

项目中建立一个build.php文件,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php

$exts = ['php', 'twig']; // 需要打包的文件后缀, twig是模版文件, 你还可以安需加入html等后缀
$dir = __DIR__; // 需要打包的目录

$file = 'Sample.phar'; // 包的名称, 注意它不仅仅是一个文件名, 在stub中也会作为入口前缀
$phar = new Phar(__DIR__ . '/' . $file, FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::KEY_AS_FILENAME, $file);

// 开始打包
$phar->startBuffering();

// 将后缀名相关的文件打包
foreach ($exts as $ext) {
$phar->buildFromDirectory($dir, '/\.' . $ext . '$/');
}

// 把build.php本身摘除
$phar->delete('build.php');

// 设置入口
$phar->setStub("<?php
Phar::mapPhar('{$file}');
require 'phar://{$file}/portal/index.php';
__HALT_COMPILER();
?>");
$phar->stopBuffering();

// 打包完成
echo "Finished {$file}\n";

生成phar包后,只需要直接引用执行就可以了,如添加index.php文件

1
2
<?php
require __DIR__ . '/Sample.phar';

在实际的项目产品中,我们可以一个模块建立一个phar包,在autoload时可以判断如果没有找到相应地phar包则试图加载相应目录。这样在线上调试时,上传相应地目录就可以。对于静态文件,如图片以及配置,以及入口文件(一般是index.php),用户定制需求或者设置可以依旧保持源码发布,方便更改调试。

性能

我没有做具体的测试,只是从网上的资料中了解到phar加载时性能会比源文件差,基本上是1.8到2倍左右,但是执行效果还是不错。而且原先公司产品也是用phar包发布。基本上没有遇到过因为phar产生的问题。

参考资料