脚本超时需用composer_process_timeout环境变量或php max_execution_time解决,process-timeout仅控制composer内部流程;卡在executing command时调前者,卡在php脚本内则调后者或set_time_limit()。

脚本超时不是process-timeout能解决的
Composer 执行 post-install-cmd 或 post-update-cmd 时卡住或报错,比如 php artisan key:generate、npm run dev 这类外部命令,process-timeout 控的是 Composer 自身流程总耗时,对子进程无约束——它根本不管脚本里跑的是什么。
真正起作用的是 PHP 自身的执行时限,以及 Composer 对子进程的硬性限制(默认 300 秒)。
-
process-timeout只影响 Composer 解析依赖、下载、解压、生成 autoload 等内部动作 - 脚本阶段(scripts)由
COMPOSER_PROCESS_TIMEOUT环境变量控制,优先级高于 config 配置 - 若脚本内含 PHP 代码(如
Illuminate\Foundation\Console\Kernel::handle()),还会受max_execution_time和set_time_limit(0)影响
COMPOSER_PROCESS_TIMEOUT 环境变量必须显式设置
在 CI/CD 或 Docker 容器中,composer config -g process-timeout 常常不生效,因为 Composer 在执行 scripts 时会忽略全局 config,只认环境变量。
临时生效(单次命令):
COMPOSER_PROCESS_TIMEOUT=1200 composer install
永久生效(推荐用于 CI):
- GitHub Actions:在
env:下添加COMPOSER_PROCESS_TIMEOUT: 1200 - GitLab CI:在
variables:中写COMPOSER_PROCESS_TIMEOUT: "1200" - Dockerfile:用
ENV COMPOSER_PROCESS_TIMEOUT=1200
注意:COMPOSER_PROCESS_TIMEOUT=0 表示不限时,但 CI 中不建议,容易因死循环或挂起导致 pipeline 卡死。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
脚本内 PHP 代码超时要单独处理
如果卡在 Laravel 的 php artisan migrate 或自定义命令里,那问题不在 Composer,而在 PHP 配置或命令逻辑本身。
常见情况和应对:
- 数据库迁移慢:检查是否启用了
DB_CONNECTION=sqlite却指向大文件,或 MySQL 没开wait_timeout - Artisan 命令未响应:确认没卡在交互式输入(加
--no-interaction)、没调用阻塞的 shell 命令(如sleep) - PHP 超时触发:在脚本开头加
set_time_limit(0),或改 php.ini 的max_execution_time = 0(CLI 模式下有效) - APCu 未启用 CLI:运行
php --ri apcu,确认apc.enable_cli是On,否则 autoload 生成极慢
跳过脚本是最直接的绕过方式
调试阶段或 CI 构建不需要运行初始化脚本时,直接禁用比调超时更安全可靠。
常用组合:
-
composer install --no-scripts --no-plugins:彻底跳过所有 scripts 和插件钩子 -
composer install --no-scripts --no-autoloader && composer dump-autoload --optimize:保留 autoload 但跳过命令,适合部署后手动触发 -
composer install --no-scripts --ignore-platform-reqs:再绕过 PHP 扩展版本检查,适用于快速验证依赖结构
注意:--no-scripts 不会影响 composer.lock 生成或 vendor 安装,只是不执行 scripts 字段里的命令。很多团队在 CI 中默认启用它,等部署完成后再单独跑 php artisan optimize:clear 类命令。
真正卡住的时候,先看 -vvv 输出最后一行是停在 Executing command 还是 Generating autoload files —— 前者是脚本超时,后者多半是文件系统或 PHP 配置问题,别一股脑调 process-timeout。










