PHP 8.1 下 Composer 装包卡在解压,我换了这台老机器的做法

店里那台专门跑后台的旧机器,Win7 装的 PHP 8.1.27,内存 4G,Composer 2.7。给客户的小商城项目装依赖,composer install 一到 Unzipping archive 就卡住,进度条不动,短则两分钟,长则直接超时退出。vendor 目录只解出一半,autoload 文件都是残缺的。项目不大,composer.lock 里四十多个包,压缩包总共一百多兆。

一开始我以为是网慢,换了镜像源,没用。后来发现卡的时候磁盘灯长亮,才反应过来是解压和校验在老机械盘上拖死了。我做了两件事。

第一,先把 Composer 的并发下载压下来,别让它一边下一边解压抢 IO:

composer config --global process-timeout 600
composer config --global --unset repos.packagist
composer config --global repos.packagist composer https://mirrors.aliyun.com/composer/
composer install --prefer-dist --no-scripts --no-progress -vvv

关键是 --no-scripts,很多包在 post-install 阶段还要跑脚本,老机器上解压没完就触发,等于雪上加霜。先装包,脚本单独跑。

第二,把缓存目录从系统盘挪到另一块盘,避开同时读写:

composer config --global cache-dir D:/composer-cache
composer clear-cache

清缓存这步别省,之前半截的 zip 留在里面,Composer 会认为已下载,直接拿坏包去解,报的错还牛头不对马嘴。

为什么这样管用:--prefer-dist 走压缩包,比 --prefer-source 拉 git 仓库省事,但解压是纯磁盘活,老机械盘随机读写一慢,进程就挂住。把下载和解压错开、把缓存挪到空闲盘,等于给它腾了条道。代价是首次安装会慢一些,因为缓存要重建,但至少不卡死。

这套做法有失效的时候。缓存目录换盘后,如果新盘是 FAT32,单个包超过 4G 的极端情况会失败,不过一般项目碰不到。另外 --no-scripts 之后必须手动补跑 composer run-script post-install-cmd,漏了会缺生成文件,我吃过一次亏,页面白屏查了半天。

你们在老机器或者低配服务器上装依赖,是压并发、换缓存盘,还是干脆把 vendor 打包传过去?我这边客户现场网络差,正琢磨哪种更稳。

0
赞同度 100% · 0 条评论 · 10 阅读

0 条评论

支持 Markdown · 回复会实时推送给对方

还没有评论,写下第一条。