Webman可打包为phar文件,但需关闭php.ini中phar.readonly=0,安装webman/console插件,确保在Linux/macOS下执行php webman build:phar命令,并将.env、public目录及runtime路径正确配置于phar包外。

Workerman 项目(如 Webman)能打包成 Phar,但默认不压缩、不加密,且生产环境必须关闭 phar.readonly = 0 才能生效。
打包前必须关掉 phar.readonly
Phar 写入依赖 PHP 的底层支持,如果 phar.readonly 开着,php webman build:phar 会直接报错:PharException: setting of stub failed 或类似权限错误。
- 找到你实际运行项目的
php.ini(不是 CLI 默认那个,而是php -i | grep 'Loaded Configuration File'显示的那个) - 把
phar.readonly = On改成phar.readonly = 0 - 重启 PHP 进程(如果是 FPM,需
systemctl reload php-fpm;CLI 场景下改完即生效)
php webman build:phar 命令执行失败的常见原因
命令看似简单,但失败往往卡在路径、权限或插件缺失上:
- 没装
webman/console插件:运行composer require webman/console,否则build:phar命令根本不存在 - 当前目录不是 Webman 项目根目录(即含
config/、app/、webman可执行文件的目录) -
build/目录不可写:检查当前用户对build/有写权限,或手动mkdir -p build && chmod 755 build - 用了 Windows 系统打包:Webman 的 Phar 打包不支持 Windows,必须在 Linux/macOS 下执行
打包后 webman.phar 启动不了?重点看这三处
生成了文件不代表能跑通。启动失败通常不是语法错,而是运行时路径和配置错位:
-
.env文件必须放在webman.phar所在目录下,不能塞进 Phar 包里——Phar 内部读不到外部.env,但外部加载器又找不到包内.env - 上传文件路径要重定向:
config/app.php中需显式设置'public_path' => base_path(false) . DIRECTORY_SEPARATOR . 'public',否则public/会被打进去,导致上传失败或 404 - 日志和 runtime 写入位置变了:运行
php webman.phar start后,runtime/会自动建在webman.phar同级目录,确保该目录可写,否则 worker 启动直接退出
要不要加 Gzip 压缩?得看场景
官方 v2.1.11+ 已支持,但不是开个开关就行,要改两处源码:
- 改
vendor/webman/console/src/Commands/BuildPharCommand.php:在new Phar(...)后加一行$phar = $phar->convertToExecutable(Phar::TAR, Phar::GZ); - 改
vendor/composer/ClassLoader.php底部include $file:套一层phar://文件锁逻辑,否则并发加载类时大概率报Class not found - 注意:启用 Gzip 后,文件扩展名变成
.phar.tar.gz,启动命令也得用php webman.phar.tar.gz start,别漏掉后缀
压缩确实能把 5.8MB 缩到 1MB,但代价是每次启动多几毫秒解压时间,且所有服务器 PHP 都得带 zlib 扩展(一般都有)。如果你部署环境老旧或对启动延迟敏感,跳过压缩更稳妥。

















