首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >惊人 82.8% 压缩率!Webman Phar 启用 Gzip 后仅 1MB

惊人 82.8% 压缩率!Webman Phar 启用 Gzip 后仅 1MB

作者头像
Tinywan
发布2026-07-01 12:54:11
发布2026-07-01 12:54:11
790
举报
文章被收录于专栏:开源技术小栈开源技术小栈

引言

Webman 是一个基于 Workerman 的高性能 PHP 框架,其 console 插件支持将项目打包成单个 Phar 文件,便于部署和分发。然而,默认的 Phar 打包仅将文件归档到单个文件中,并未启用压缩,导致打包后的文件体积较大,占用更多磁盘和内存空间。

通过启用 Gzip 压缩,可以显著减小 Phar 文件大小(实际测试中可压缩至原大小的 20%-30%),同时还能在一定程度上保护源码(直接用文本编辑器打开 Phar 文件时无法直观查看内容)。本文基于社区实践,介绍如何在 Webman 项目中实现 Phar 的 Gzip 压缩打包,并解决潜在的兼容性问题。

最新发布版本 webman/console v2.1.11 已经支持 Gzip 压缩打包

压缩的优缺点

优点

  • 大幅减小文件体积,降低磁盘占用和内存加载开销。
  • 提升源码安全性,防止直接查看内部代码。

缺点

  • 启动时可能有轻微延迟(文件越多延迟越明显,通常在毫秒级)。
  • 生产环境需支持相应的压缩扩展(Gzip 为 PHP 内置,通常无问题)。

实现步骤

建议在空项目中测试,避免影响现有代码。核心是通过修改 vendor 中的相关文件来实现。

1. 启用 Gzip 压缩

修改 vendor/webman/console/src/Commands/BuildPharCommand.php 文件,大约在第 49 行附近:

原代码类似:

代码语言:javascript
复制
$phar = new Phar($phar_file, alias: 'webman');

修改为:

代码语言:javascript
复制
$phar = new Phar($phar_file, alias: 'webman');
$phar = $phar->convertToExecutable(Phar::TAR, Phar::GZ);  // 启用 TAR + GZ 格式

这会将 Phar 转换为可执行的 TAR.GZ 格式,实现压缩。

2. 修复 Composer 类加载器并发问题

在多进程环境下,压缩 Phar 可能导致文件读取错乱,引发类加载失败。通过文件锁机制修复。

修改 vendor/composer/ClassLoader.php 文件底部,将 include $file; 替换为:

代码语言:javascript
复制
if (str_starts_with($file, 'phar://')) {
    $lockFile = sys_get_temp_dir() . '/phar_' . md5($file) . '.lock';
    $fp = fopen($lockFile, 'c');
    flock($fp, LOCK_EX) && include $file;
    fclose($fp);
    file_exists($lockFile) && @unlink($lockFile);
} else {
    include $file;
}

这确保在 Phar 文件读取时使用独占锁,避免并发冲突。

3. 处理二进制文件和进程启动兼容

对于二进制资源,文件锁可能无效。可通过延迟进程启动来缓解。

修改 vendor/workerman/workerman/src/Worker.php,在 static::forkOneWorkerForLinux($worker); 后添加:

代码语言:javascript
复制
php_sapi_name() == 'micro' && usleep(50000);  // 延迟 50 毫秒

这在 Micro SAPI(Phar 运行模式)下为每个进程添加短暂延迟,减少竞争。

4. 打包与部署

执行打包命令:

代码语言:javascript
复制
php webman build:phar

生成的压缩文件通常位于 build/webman.phar.tar.gz,上传至服务器。

5. 运行与验证

在服务器上运行:

代码语言:javascript
复制
php webman.phar.tar.gz start

无报错即成功。测试访问:

代码语言:javascript
复制
curl http://127.0.0.1:8787/

效果对比

实际测试中,无压缩 Phar 可能达 30-40MB,启用 Gzip 后可压缩至 7-10MB(压缩率约 70-80%),具体取决于项目中代码与资源比例(纯代码项目压缩率更高)。

注意事项与改进建议

  • 以上修改涉及 vendor 目录,升级依赖时需重新应用。
  • 社区已提交相关 PR(如 webman-console),未来版本可能内置支持,无需手动修改。
  • 如果项目包含大量图片或其他已压缩资源,压缩率会降低。
  • 生产环境测试启动性能,确保延迟在可接受范围内。

通过这些优化,Webman Phar 部署更高效、更安全,适合单文件分发场景。如果你在实践中遇到问题,欢迎进一步探索或贡献社区!

参考链接

https://www.php.net/manual/zh/phar.converttoexecutable.php https://www.php.net/manual/zh/phar.fileformat.comparison.php

原文: https://www.workerman.net/a/1959 workerman社区

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-01-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开源技术小栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • 压缩的优缺点
  • 实现步骤
    • 1. 启用 Gzip 压缩
    • 2. 修复 Composer 类加载器并发问题
    • 3. 处理二进制文件和进程启动兼容
    • 4. 打包与部署
    • 5. 运行与验证
  • 效果对比
  • 注意事项与改进建议
  • 参考链接
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档