Skip to content

Phar 归档

Phar(PHP Archive)是 PHP 专属的归档格式,类似于 Java 的 JAR。Phar 可以将整个 PHP 应用打包为单个文件,方便分发和部署。Composer 的 .phar 包就是使用 Phar 格式。本节将讲解 Phar 的创建和使用。

前置知识

阅读本节前,建议先了解:Zip 扩展CLI 开发

基础概念

Phar 优势

  • 将应用打包为单个可执行 PHP 文件
  • 内置签名验证确保完整性
  • 支持文件映射(无需解压即可读取)
  • 广泛用于工具分发(如 PHPUnit、Composer)

启用 Phar

ini
; php.ini
phar.readonly = Off  ; 允许创建 Phar

创建 Phar

php
<?php
declare(strict_types=1);

$phar = new Phar('/tmp/myapp.phar', 0, 'myapp.phar');
$phar->startBuffering();

// 添加文件
$phar->addFile('src/index.php', 'index.php');
$phar->addFile('src/Config.php', 'Config.php');

// 添加整个目录
$phar->buildFromDirectory('src/', '/');

// 设置 stub(入口文件)
$stub = "#!/usr/bin/env php\n"
    . "Phar::mapPhar('myapp.phar');\n"
    . "require 'phar://myapp.phar/index.php';\n"
    . "__HALT_COMPILER();\n";
$phar->setStub($stub);

$phar->stopBuffering();

echo "Phar 创建成功" . PHP_EOL;

读取 Phar

php
<?php
declare(strict_types=1);

// 直接运行
// php /tmp/myapp.phar

// 读取 Phar 内文件
$phar = new Phar('/tmp/myapp.phar');
foreach (new RecursiveIteratorIterator($phar) as $file) {
    echo $file . PHP_EOL;
}

// 获取文件内容
$content = file_get_contents('phar:///tmp/myapp.phar/index.php');

注意事项

  • 生产环境 phar.readonly 应设为 On
  • Phar 不适合打包包含大量静态资源的应用

下一节

继续学习:OpenSSL 扩展

参考链接