Composer 的 process-timeout 是控制外部命令(如 git clone、unzip)单次执行最长秒数的配置,默认 300 秒,超时抛 ProcessTimedOutException;支持命令行、项目 config、全局 config 三种设置方式,优先级递减,但不支持 scripts 内单独设置。

Composer 的 process-timeout 是什么?
它控制 Composer 在执行外部命令(比如 git clone、unzip 或脚本中调用的 php 命令)时,单个进程允许运行的最长时间(单位:秒)。默认值是 300(5 分钟),超时会直接抛出 ProcessTimedOutException 错误。
全局设置 process-timeout 的三种方式
优先级从高到低:命令行参数 > 项目配置 > 全局配置。注意:它不支持在 composer.json 的 scripts 段内单独为某条脚本设置超时。
- 临时生效(仅本次命令):
composer install --process-timeout=1200
- 写入当前项目配置(影响所有成员):
composer config process-timeout 1200
,会写入composer.json的config.process-timeout字段 - 设为全局默认(影响所有项目):
composer config --global process-timeout 1200
为什么给脚本加超时不能只靠 config?
因为 process-timeout 只作用于 Composer 自身调用的子进程(如下载、解压、install 脚本阶段的钩子),而你自定义的 scripts 中写的命令(比如 "post-install-cmd": "php artisan migrate")是通过 PHP 的 proc_open() 启动的,它们的超时由 Composer 的内部调度器统一管控——也就是说,改了 process-timeout 就管得到这些脚本。
但要注意:
- 如果脚本里自己用
exec()、shell_exec()或proc_open()再起进程,Composer 不会干预那些子子进程 -
process-timeout对纯 PHP 脚本(无外部调用)无效,比如一个死循环的php -r "while(1);"不会因该配置中断 - Windows 下某些 Git 操作可能因权限或杀毒软件导致假性卡死,单纯调大 timeout 只是掩耳盗铃
调试超时问题的实用技巧
当看到类似错误时:The process "git clone ..." exceeded the timeout of 300 seconds.,别急着调高 timeout,先确认是否真慢:
- 手动执行报错命令(把 Composer 日志里的完整命令复制出来),看是否真的卡住
- 检查网络或镜像源是否异常,比如用
composer config repo.packagist composer https://packagist.phpcomposer.com切国内镜像 - 用
--verbose查看具体卡在哪一步:composer update --verbose --process-timeout=600
- 极端情况可临时禁用超时(不推荐长期用):
composer config process-timeout 0
,0 表示无限等待
真正难处理的不是 timeout 值设多少,而是分不清「是网络慢、权限问题、还是脚本逻辑阻塞」——先定位再调参,否则只是把失败从 5 分钟延后到 20 分钟。










