直接换镜像源+调高超时和内存限制更可靠,因phpspreadsheet的dist zip常超80mb,composer默认无断点续传,易因网络抖动或php默认限制(30s/128m)导致下载失败、超时或内存耗尽。

直接换镜像源 + 调高超时和内存限制,比硬扛下载更可靠。PhpSpreadsheet 的 dist ZIP 包常超 80MB,Composer 默认用 curl 直下、无断点续传,一卡就失败,重试还从头开始。
为什么 composer require phpoffice/phpspreadsheet 总卡在 “Downloading…”
根本不是包本身有问题,而是 Composer 下载阶段就崩了:它不支持 HTTP Range 分块,也不做断点续传;遇到网络抖动、DNS 慢、服务器响应延迟,cURL error 56 或 file could not be downloaded 就立刻报错。尤其国内直连 github.com 或 repo.packagist.org,大包下载成功率极低。
- 错误现象:反复出现
Failed to download phpoffice/phpspreadsheet, retrying...,最终Maximum execution time exceeded或Allowed memory size exhausted - 关键原因:PHP CLI 的
max_execution_time和memory_limit默认值(30s / 128M)远不够解压+校验一个 80MB+ 的 ZIP - 注意:这不是 PhpSpreadsheet 特有,所有含大 dist ZIP 的包(如
laravel/framework、symfony/symfony)都可能中招
换镜像源 + 降并发 + 延长超时(三步必做)
不换源,其他操作效果有限。阿里云、清华、Laravel China 镜像都托管了完整 dist 文件,CDN 加速后下载更稳。
- 设全局镜像:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - 延长超时(单位秒):
composer config -g process-timeout 3600,同时加http.timeout 600 - 强制降并发(减少单次请求压力):
composer install --no-interaction --prefer-dist --no-progress,避免进度条刷新干扰 - 别信“--reinstall”或“--update-with-dependencies”,它们不会绕过下载环节
实在下不动?跳过下载,用本地缓存硬塞
Composer 本身不支持分块,但能跳过 ZIP 下载——前提是把包提前解压进缓存目录,让它直接复制。这招对 CI/CD 或内网部署特别管用。
- 手动去
https://packagist.org/packages/phpoffice/phpspreadsheet找最新版的dist.url(通常是 GitHub release ZIP) - 用
wget或浏览器下载,解压到:$COMPOSER_CACHE_DIR/files/phpoffice/phpspreadsheet/xxx-hash/(hash 可从 packagist 页面 copy) - 确保
composer.json中版本锁定,例如:"phpoffice/phpspreadsheet": "1.29.0",否则 Composer 可能忽略缓存 - 运行:
composer require phpoffice/phpspreadsheet --no-update && composer update --no-interaction --prefer-dist
PHP 配置和扩展必须同步调高
就算走缓存,Composer 还要解压、计算 hash、写 vendor、生成 autoloader——这些全靠 PHP 进程扛。CLI 和 Web 用的 php.ini 往往不是同一个,这点最容易被忽略。
- 查 CLI 当前配置:
php -i | grep "Loaded Configuration File" - 改对应
php.ini:memory_limit = 2G、max_execution_time = 1800、post_max_size = 512M - 确认
zip、xml、mbstring已启用:php -m | grep -E "zip|xml|mbstring",缺一不可 - 别忘了
openssl和allow_url_fopen = On,否则连镜像源都打不开
最常漏的是:以为换了镜像就万事大吉,结果 PHP CLI 内存还是 128M,跑两分钟就 Allowed memory size exhausted —— 它根本没机会走到解压那步,就在校验阶段崩了。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











