根本原因不是网络延迟,而是composer未禁用网络时固执重试连接;必须前置设置composer_disable_network=1,清空所有repo.packagist配置,并配合--no-plugins --no-scripts --no-autoloader及--prefer-dist,确保完全离线运行。

composer install 在离线环境下报超时,根本不是网络延迟问题——它压根没在“等”,而是在反复重试连接 @#@#@#@#@#@#@#@#@#@0,直到 TCP 连接超时(默认约 10 秒)后才报错。你看到的 Could not fetch packages.json 或 cURL error 28: Operation timed out,本质是 Composer 拒绝接受“无网”这个事实,还在固执地发请求。
COMPOSER_DISABLE_NETWORK=1 必须前置且生效
这是所有离线操作的硬性开关,不设它,后面所有 --no-xxx 参数都形同虚设。
- 它不是“建议开启”,而是 Composer 离线模式的唯一入口:只有设了它,Composer 才会跳过所有 HTTP 请求逻辑,直接读取本地缓存、lock 文件或仓库配置
- 必须放在命令最前面:
COMPOSER_DISABLE_NETWORK=1 composer install ...
写成composer install COMPOSER_DISABLE_NETWORK=1是无效的 - 验证是否生效:临时在
/etc/hosts加一行127.0.0.1 repo.packagist.org,再跑COMPOSER_DISABLE_NETWORK=1 composer install -v
如果日志里不再出现Downloading @#@#@#@#@#@#@#@#@#@0,说明已真正切断
repo.packagist false 必须全局+项目级双清
即使设了 COMPOSER_DISABLE_NETWORK=1,如果配置里还残留 repo.packagist,Composer 仍会尝试 fallback 请求,导致超时。
- 全局禁用:
composer config --global repo.packagist false - 检查项目级是否覆盖:
composer config repo.packagist
输出应为空;若显示composer @#@#@#@#@#@#@#@#@#@2或镜像地址,必须删掉:composer config --unset repos.packagist - 查看完整配置:
composer config --global --list | grep -i repo
只允许出现你手动加的本地path或composer类型仓库,其余全清
--no-plugins --no-scripts --no-autoloader 缺一不可
这些参数不是“优化项”,而是防止插件/脚本在初始化阶段偷偷触发网络调用:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
--no-plugins:阻止phpstan/extension-installer、composer/installers等插件在PluginManager::load()时访问远程服务 -
--no-scripts:跳过post-install-cmd,避免脚本里写死的file_get_contents('https://...')或curl_exec -
--no-autoloader:绕过 autoload 重建流程,某些自定义 autoloader(如扫描注解)会尝试加载不存在的远程类路径,引发 DNS 查询阻塞
执行完这行命令后,记得补一记:composer dump-autoload -o,否则运行时大概率 Class not found。
超时背后常被忽略的真问题:dist URL 还是 HTTPS
composer.lock 里每个包的 dist.url 字段如果是 https:// 开头(比如来自阿里云镜像),即使设了 COMPOSER_DISABLE_NETWORK=1,Composer 也会直接退出并报错,不会降级到缓存或本地路径。
- 正确做法:联网机上构建时,确保所有包走
--prefer-dist,并把 ZIP 包完整拷进cache-files-dir
然后在离线机执行:composer config --global cache-files-dir /opt/composer-cache
再运行:COMPOSER_DISABLE_NETWORK=1 composer install --no-plugins --no-scripts --no-autoloader --prefer-dist - 若 lock 文件里已有 HTTPS dist URL,又无法重生成,只能手动编辑
composer.lock,把所有"dist": {"url": "https://..."}改成"dist": {"url": "file:///opt/composer-cache/..."}(注意路径需真实存在且可读)
离线环境里,“超时”从来不是时间问题,而是信任链没断干净——只要还留一条网络出口,Composer 就会一头撞上去。










