php 7.2 完全支持 phar 打包独立可执行应用,但必须关闭 phar.readonly 且 halt_compiler(); 缺一不可;否则 stub 无效、文件无法执行,打包时需显式过滤路径、用 phar:// 协议访问内部资源,并避免依赖 __dir 等真实路径。

PHP 7.2 完全支持 PHAR 打包独立可执行应用,但必须关闭 phar.readonly,且 __HALT_COMPILER(); 缺一不可——漏掉它,PHAR 文件根本无法执行。
打包前必须关掉 phar.readonly
PHP 7.2 默认开启 phar.readonly = On,这会直接导致 Phar 类写入失败,报错类似 PharException: setting stub not permitted 或 write operations disabled。
- 检查当前值:
php -i | grep phar.readonly - 临时修改(开发/构建机):编辑
php.ini,设为phar.readonly = Off,然后重启 CLI PHP(无需 web server) - CI 环境中建议用
php -d phar.readonly=Off build-phar.php避免污染全局配置 - 打包完成后,强烈建议恢复
phar.readonly = On,防止运行时意外写入
setStub() 必须包含 Phar::mapPhar() 和 __HALT_COMPILER();
PHAR 的 stub 不是普通 PHP 代码,它是解释器识别 PHAR 边界的“签名”。少写或错写会导致文件被当成普通 PHP 脚本执行,直接报 Parse error: syntax error, unexpected end of file。
- 正确 stub 示例:
<?php Phar::mapPhar("myapp.phar"); require "phar://myapp.phar/bin/cli.php"; __HALT_COMPILER(); ?> -
Phar::mapPhar()是必需的,否则phar://协议无法解析内部路径 -
__HALT_COMPILER();必须紧贴?>后、无空格、无换行,且只能出现一次 - 不要用
createDefaultStub()自动生成——它在 PHP 7.2 下可能生成不兼容的 stub(尤其含相对路径时)
用 buildFromDirectory() 时注意路径与过滤
PHP 7.2 的 Phar::buildFromDirectory() 不自动排除 .git、vendor/.DS_Store 等垃圾文件,打进去不仅增大体积,还可能引发权限或加载错误。
- 推荐显式过滤:
$phar->buildFromDirectory(__DIR__ . '/src', '/\.php$/');(只打包 .php 文件) - 若需包含配置或模板,用正则组合:
'/\.php$|\.json$|\.html$/' - 避免传入绝对路径字符串(如
/var/www/myapp),改用__DIR__+ 相对路径,确保构建脚本可迁移 - 压缩选
Phar::GZ即可;PHP 7.2 不支持Phar::ZLIB(那是 PHP 7.3+ 新增)
执行时路径和 __FILE__ 行为会变
打包后所有 __DIR__、__FILE__、dirname(__FILE__) 都指向 PHAR 内部虚拟路径(如 phar:///path/to/app.phar/src),不是磁盘真实路径——这是最常踩的坑。
- 日志、缓存、上传目录等外部路径,绝不能基于
__DIR__构造,应通过环境变量或配置文件硬编码(如sys_get_temp_dir()或getenv('APP_STORAGE')) - 加载 PHAR 内部资源必须用
phar://协议:file_get_contents('phar://myapp.phar/config/app.json') - 第三方库(如 Composer autoload)若依赖真实文件系统路径,需提前 patch 或改用
Phar::interceptFileFuncs()(慎用,有兼容风险)
PHP 7.2 的 PHAR 支持稳定,但它的路径虚拟化机制是“静默生效”的——出问题时不会报错,只会读不到文件或加载空白。务必在打包后立刻用 php myapp.phar 在干净环境里验证,而不是只测构建脚本是否跑通。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











