PHAR归档文件能将PHP项目打包成单个自包含文件,极大简化部署流程。它解决了传统部署中依赖管理复杂、环境不一致、回滚困难等问题,特别适用于CLI工具和小型Web应用。通过Phar类创建PHAR时需关闭phar.readonly,使用buildFromDirectory打包代码与依赖,并设置stub作为执行入口。优势包括:单文件部署省去git clone和composer install;环境一致性避免“在我机器上能运行”的问题;版本化PHAR便于回滚;分发便捷,用户仅需PHP解释器即可运行。注意事项有:必须手动处理外部配置与日志路径;__DIR__和__FILE__在PHAR内指向虚拟路径;stub中引用内部文件需用phar://协议;建议打包后开启phar.readonly提升安全性。CI/CD中可自动化构建PHAR并结合符号链接实现平滑部署,也可集成进Docker镜像实现容器化交付。

PHP的PHAR归档文件,在我看来,就是PHP世界里的一个自包含(self-contained)应用包,它能把你的整个PHP项目,包括代码、资源文件甚至第三方依赖,都打包成一个独立的文件。这对于应用的部署和分发简直是福音,尤其是那些CLI工具或小型Web应用,部署时只需要简单地复制这一个文件就行了。它极大地简化了传统PHP项目部署时繁琐的
git pull
composer install
要创建一个PHAR归档文件,我们首先需要确保PHP环境允许写入PHAR文件。这通常意味着在
php.ini
phar.readonly
Off
On
核心的打包过程主要依赖PHP内置的
Phar
假设我们有一个名为
my-app
立即学习“PHP免费学习笔记(深入)”;
my-app/ ├── src/ │ └── greeter.php ├── vendor/ │ └── autoload.php │ └── ... (Composer dependencies) ├── config/ │ └── app.php └── cli-tool.php
其中
cli-tool.php
greeter.php
vendor
打包脚本示例 (build.php
<?php
// 确保phar.readonly是Off,否则无法创建
if (ini_get('phar.readonly') == 1) {
echo "请在php.ini中设置 'phar.readonly = Off' 后再运行此脚本。\n";
exit(1);
}
$pharFile = 'my-app.phar';
$appDir = __DIR__ . '/my-app'; // 你的应用根目录
// 如果PHAR文件已存在,先删除它
if (file_exists($pharFile)) {
unlink($pharFile);
}
if (file_exists($pharFile . '.gz')) { // 如果有压缩版,也删除
unlink($pharFile . '.gz');
}
try {
// 1. 创建一个新的Phar对象
$phar = new Phar($pharFile);
// 2. 将整个应用目录添加到PHAR中
// 第二个参数是文件在PHAR内部的路径前缀
$phar->buildFromDirectory($appDir, '/^((?!build\.php).)*$/'); // 排除打包脚本自身
// 3. 设置应用的启动器(stub)。这是PHAR文件被执行时最先运行的代码。
// 通常,它会包含Composer的自动加载器和你的应用入口点。
$phar->setStub($phar->createDefaultStub('cli-tool.php'));
// 4. (可选) 压缩PHAR文件,可以减小体积
// $phar->compressFiles(Phar::GZ); // 使用Gzip压缩
// $phar->compressFiles(Phar::BZ2); // 使用Bzip2压缩
// 5. (可选) 设置PHAR的元数据,比如版本信息
$phar->setMetadata(['version' => '1.0.0', 'build_date' => date('Y-m-d H:i:s')]);
echo "PHAR文件 '{$pharFile}' 创建成功!\n";
} catch (Exception $e) {
echo "创建PHAR时发生错误: " . $e->getMessage() . "\n";
exit(1);
}
// 完成后,你可以考虑将phar.readonly改回On,以提高安全性
// ini_set('phar.readonly', 'On'); // 这行代码在打包脚本中执行意义不大,需要手动修改php.ini运行这个
build.php
my-app.phar
php my-app.phar
如果你的应用入口文件不在根目录,或者需要更复杂的启动逻辑,
createDefaultStub()
// stub.php <?php // 这是PHAR的启动器,会被执行 // 确保Composer的autoload在PHAR内部被加载 require 'phar://' . __FILE__ . '/vendor/autoload.php'; // 然后加载你的应用入口 require 'phar://' . __FILE__ . '/cli-tool.php'; __HALT_COMPILER(); // 必须有这一行,标志着stub的结束和PHAR内容的开始 ?>
然后,在打包脚本中这样设置stub:
$phar->setStub(file_get_contents('stub.php'));在我看来,PHAR打包最核心的价值在于它提供了一种“单文件部署”的能力。这真的太省心了。回想一下传统的PHP应用部署流程:
git clone
composer install
composer install
PHAR直接把这些问题都解决了。
phar.readonly
On
当然,PHAR也不是万能药,它有自己的适用场景。对于大型Web应用,特别是那些需要频繁更新、大量静态资源(图片、CSS、JS)或动态生成内容的场景,PHAR可能就不是最优解了。但对于CLI工具、微服务或者一些后端服务,它的优势非常明显。
我自己在实际使用PHAR的过程中,也踩过一些坑,总结下来有这么几点,我觉得特别值得注意:
phar.readonly
php.ini
phar.readonly
Off
On
createDefaultStub()
phar://
require 'phar://' . __FILE__ . '/path/to/file.php';
phar://
__DIR__
__FILE__
__DIR__
__FILE__
buildFromDirectory
vendor
composer install --no-dev
vendor
fastcgi_pass
SCRIPT_FILENAME
部署PHAR应用,我发现最核心的理念就是“少即是多”。一个文件搞定一切,这本身就是最大的策略。
CI/CD自动化集成:这是我最推荐的方式。将PHAR的打包过程集成到你的持续集成/持续部署(CI/CD)流程中。当代码合并到主分支时,CI服务器(比如Jenkins、GitHub Actions、GitLab CI)会自动执行打包脚本,生成PHAR文件。
composer install --no-dev
build.php
.phar
.phar
my-app-1.0.0.phar
my-app-abcdef1.phar
部署策略:
scp
rsync
/opt/my-app/releases/1.0.0/my-app.phar
/opt/my-app/current/my-app.phar
ENTRYPOINT
php my-app.phar
生产环境配置与运行:
php /path/to/my-app.phar [arguments]
fastcgi_pass
SCRIPT_FILENAME
.phar
php my-app.phar --config=/etc/my-app/config.php --log-dir=/var/log/my-app
总之,PHAR的实践策略就是尽可能地利用其“单一文件”的特性,简化从开发到部署的整个流程。它让PHP应用的交付变得更像一个独立的二进制程序,这对于许多场景来说,确实是一种巨大的进步。
以上就是php如何创建一个phar归档文件 php Phar打包应用与部署方法的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号