根本不用调max_execution_time——Composer在中文环境报Maximum execution time错误,99%是因误在Web环境运行或未同步配置http.timeout(推荐600秒)和process-timeout(推荐1800秒)两个参数,二者独立生效且缺一不可。

根本不用调 max_execution_time —— Composer 在中文环境报 Fatal error: Maximum execution time of 30 seconds exceeded,99% 不是 PHP 限制导致的,而是你误在 Web 环境跑 CLI 工具,或没配对两个关键超时参数。
为什么改 php.ini 的 max_execution_time 没用
Composer 是命令行工具,走的是 PHP CLI SAPI。max_execution_time 在 CLI 模式下默认就是 0(不限制),根本不会触发那个错误。你看到这个报错,只有一种可能:你在浏览器里、用 shell_exec()、或通过 Nginx/Apache + PHP-FPM 调用了 php composer.phar install —— 这属于错误使用方式,必须停掉。
- CLI 下查真实值:
php -i | grep max_execution_time,输出应为0 - Web 环境下强行改
max_execution_time不仅无效,还可能被 FPM 的request_terminate_timeout或网关(如 Nginxfastcgi_read_timeout)二次截断 -
ini_set('max_execution_time', 0)在 CLI 中无效,set_time_limit(0)只对当前 PHP 进程有效,且不控制 Composer 自身子进程
真正要调的是 http.timeout 和 process-timeout
Composer 卡住,实际是两层独立超时叠加:一层是 HTTP 下载(比如拉 packages.json 或 ZIP 包),另一层是本地子进程(比如 git clone、unzip、php artisan optimize)。这两个必须同步设大,缺一不可。
- 查当前值:
composer config -g http.timeout和composer config -g process-timeout - 推荐设为:
composer config -g http.timeout 600(单位秒,旧版默认 5 秒,新版默认 300) - 同时执行:
composer config -g process-timeout 1800(私有库或含二进制包时容易卡住,1800 是安全上限,超过 7200 秒会被 Composer 忽略) - 注意:
process-timeout不管你的自定义脚本(如post-install-cmd),那部分仍由 PHP 的max_execution_time控制
自定义脚本(post-install-cmd 等)超时怎么办
你在 composer.json 里写的 "post-install-cmd": "php build.php",本质是启动一个新 PHP 进程,它的超时跟 Composer 配置完全无关,只受 PHP 自身限制。
立即学习“PHP免费学习笔记(深入)”;
- 临时生效:
php -d max_execution_time=0 composer install(CLI 下最稳) - CI/CD 中显式传参:
php -d max_execution_time=900 composer run-script post-build - 脚本内主动控制:
set_time_limit(1200)放在build.php开头,但必须早于任何耗时操作 - 别信
"config": {"timeout": 600}—— 这个字段不存在,Composer 会直接忽略
镜像源和 fallback 是隐形超时杀手
即使你设了超时,如果没关掉 packagist.org 的自动回退,Composer 仍会先花几十秒尝试直连官方源失败后才切镜像 —— 这段等待不计入 http.timeout,但会拖垮整体时间。
- 换阿里云镜像:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - 彻底禁用回退:
composer config -g repos.packagist false - 验证是否生效:
composer diagnose输出里应显示 “Using repository: https://mirrors.aliyun.com/composer/”,且没有 “Fallback to packagist.org” 字样 - 别依赖
--prefer-dist或--no-scripts临时绕过 —— 它们能帮你定位问题,但不是长期解法
最常被忽略的一点:process-timeout 和 http.timeout 是两条平行链路,改错一个就白调;而所有 Web 环境下的 Composer 调用,本质上都是错的入口,得先切到终端再排查。



















