在我们使用composer管理PHP项目的依赖库时,而在生产环境没有安装composer的情况,如果发布项目使用呢?这里我们介绍一种方法,可以将PHP项目代码和依赖库打包为PHAR包,在生产环境引入PHAR包,就可正常使用。
本文介绍的方法,对vendor文件夹里的所有依赖库和项目代码中的src/GoldScraper.php进行打包,也支持对整个项目源码打包,可参照vendor的遍历方法,将src文件夹里所有php文件都加入打包。
安装composer,可参考另一篇文章Composer使用方法
PHAR(PHP Archive)是一种可执行的压缩包,可将项目代码和依赖打包为单个文件,无需 Composer 即可运行。适用于生产环境没有安装composer的情况。
打开 php.ini 文件,找到 phar.readonly 配置项,将其值从 On 修改为 Off。(只有打包的开发环境需要更改)
<?php
// 创建 PHAR 文件
$phar = new Phar('your-library.phar', 0, 'your-library.phar');
// 开始打包
$phar->startBuffering();
// 添加包含 GoldScraper 类的文件
$phar->addFile('src/GoldScraper.php', 'src/GoldScraper.php');
$phar->setSignatureAlgorithm(Phar::SHA256); // 设置签名算法
// 添加 Composer 自动加载器
$phar->addFile('vendor/autoload.php', 'vendor/autoload.php');
// 添加 Composer 自动加载文件(关键!)
$vendorDir = __DIR__ . '/vendor/';
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($vendorDir, RecursiveDirectoryIterator::SKIP_DOTS | FilesystemIterator::FOLLOW_SYMLINKS),
RecursiveIteratorIterator::SELF_FIRST
);
foreach ($iterator as $file) {
if ($file->isDir()) continue;
if ($file->getExtension() === 'php') {
$localPath = ltrim(str_replace(__DIR__ . '/', '', $file->getPathname()), '/');
$phar->addFile($file->getPathname(), $localPath);
}
}
// 设置默认入口文件
$phar->setDefaultStub('src/GoldScraper.php');
// 使用gzip压缩文件
$phar->compressFiles(Phar::GZ);
// 结束打包
$phar->stopBuffering();
echo "PHAR 包生成成功\n";
# bash
php build.phar.php
直接通过 PHP 命令执行 PHAR 包,或在代码中引入:
require __DIR__ . '/your-library.phar';
use YourNamespace\YourClass; // 来自 PHAR 中的依赖
$client = new Client();
$obj = new YourClass($client);
$obj->fetchData();
// 在项目代码中引入autoload.php
if (\Phar::running()) {
// PHAR 环境
require_once 'phar://' . \Phar::running(false) . '/vendor/autoload.php';
} else {
// 普通文件系统环境
require_once __DIR__ . '/../vendor/autoload.php';
}
// 定义引用文件的根路径
$basePath = Phar::running() ? dirname(Phar::running(false)) : __DIR__ . '/..';
转载请注明:半亩方塘 » 将PHP项目代码和依赖打包为PHAR包