Phar,是一种将PHP程序打包的工具,至PHP5.3以来开始支持,这个就类似于Java中的jar包,使用的时候也十分简便,只要include或者require即可,网上的许多PHP的SDK也支持这种打包方式。下面就简单说下怎么使用phar打包以及引入phar包。

实验环境

  • PHP5.6

打包PHP程序

修改PHP配置

要想利用Phar将PHP应用程序打包,先修改php.ini的相关配置

打开php.ini,找到phar.readonly

1
phar.readonly = Off # 去掉;的注释,并且将On改为Off

此时就可以愉快的使用phar打包

开始打包

假定项目的目录结构如下图:

Demo的github地址

build.php 为我们的打包程序. 内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
// 参数内容为生成文件路径 此例中则在当前目录生成example.phar打包程序
$phar = new Phar('example.phar');
// 开始打包
$phar->startBuffering();
// 要打包的目的目录 绝对路径
$phar->buildFromDirectory(__DIR__);
// 压缩方式 GZ->gzip BZ2->bz2
$phar->compressFiles(Phar::GZ);
// 设置启动加载脚本 即导入phar之后第一个自动执行的脚本
$phar->setStub($phar->createDefaultStub('index.php'));
// 结束打包
$phar->stopBuffering();

其中buildFromDirectory方法还接收第二个参数可以用正则表达式来筛选不需打包的文件

1
2
3
<?php
// 只打包结尾为.php的文件
$phar->buildFromDirectory(__DIR__,'/\.php$/');

使用phar打包程序

  • 如果是直接使用整个项目的话可以直接,用include 或者 require
1
2
3
<?php
// 直接导入phar包 并且会自动执行启动脚本
require_once __DIR__.'/example.phar';
  • 如果只是导入phar中的一个脚本,可以这样
1
2
3
<?php
// 只导入 your_script.php 这个脚本
include 'phar://example.phar/your_project_path/your_script.php';

注意事(坑)项(点)

假如你打包的项目中,入口文件index.php 要引入(include or require)项目中的其他脚本,务必使用绝对路径,否则你打包成phar包之后,其他项目要引入这个phar就会路径出错!!,即如下:

1
2
3
<?php //这是index.php 入口文件
require __DIR__."/src/controller.php"; //要使用绝对路径
require "./lib/tools.php"; //不要使用相对路径

感谢 & 参考资料

韩天峰大大的博客

官方文档