目前webman/console中phar打包只是将项目文件添加到phar单文件中,并未进行压缩,所以我在一年前就开始研究了,但是以失败结束研究,不过就在昨天,我再次尝试phar压缩发现在单进程中可以很好的运行,在此分享这次的研究成果。
优点:
缺点:
https://www.php.net/manual/zh/phar.converttoexecutable.php
https://www.php.net/manual/zh/phar.fileformat.comparison.php
建议使用空项目
打开vendor/webman/console/src/Commands/BuildPharCommand.php修改约第49行的代码:
$phar = new Phar($phar_file, alias: 'webman');
// 添加此处代码,参数1可选PHAR、TAR、ZIP,参数2可选GZ、BZ2
$phar = $phar->convertToExecutable(Phar::TAR, Phar::GZ);
最终代码:

打开vendor/composer/ClassLoader.php,翻到代码底部,将 include $file;替换为以下代码:
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;
}
最终代码:

二进制文件未知原因文件锁未生效,使用进程延迟加载方法。
打开vendor/workerman/workerman/src/Worker.php搜索static::forkOneWorkerForLinux($worker);在后面添加下面这行代码:
php_sapi_name() == 'micro' && usleep(50000); // 每启动一个进程后延迟50毫秒
运行php webman build:phar后将build/webman.phar.tar.gz上传至服务器
在服务器运行php webman.phar.tar.gz start,无报错即为运行成功
curl http://127.0.0.1:8787/



大佬厉害👍🏻
非常精彩的分享 👍👍👍
大佬666
挺有用的分享
大佬 能不能不该源码 想想办法 在打包命令执行的代码里面实现呢,如果能就太高级了
我正在准备提交pr,在这之前还要研究一下composer加载器如何修改
加油,还有压缩感觉只有30%左右 您再多测试 测试
大佬 我测试了 实际压缩 只有30%左右 34M 压缩完10M
目录内是否有gzip不好压缩的文件,比如图片之类的
没有 现在是30M左右 打完包 7M左右 还可以
给力!感谢分享
牛的👍
兔子大佬,他这个我测试了,发现启动一直报错,应该是代码混乱了
我还没试过,但理论上行得通,可能是有些步骤没做对,你多看看;空了我试试
就看您了,大佬 我是没想到啥办法
我提交了pr,针对报错如果有更好的解决方法可以随时通知我
https://github.com/webman-php/console/pull/51