Composer 不响应 CPU 或内存变化,因其仅为静态依赖解析工具,无运行时监控、无指标采集、无反馈闭环,不读取 /proc/stat 或 cgroup,也不集成 Prometheus;调度需下沉至 Kubernetes、Horizon 或自定义 CLI 层。

Composer 本身不支持实时负载驱动的调度——它是一个静态依赖解析与安装工具,没有运行时监控能力,也不参与 PHP 进程调度、队列分发或资源负载决策。
为什么 composer install 不会响应 CPU 或内存变化
Composer 的核心流程在安装阶段完成:读取 composer.json → 锁定版本 → 下载包 → 解压 → 执行 post-install-cmd 脚本。整个过程无心跳、无指标采集、无反馈闭环。
- 它不连接 Prometheus、不读取
/proc/stat、不监听 cgroup usage; -
composer update不会因为当前服务器 load > 5 就自动降级到低优先级扩展; - 即使你把
"ext-redis": "^5.3"写进 require,Composer 也不会在 redis.so 加载失败时 fallback 到ext-predis。
真正能做实时负载调度的组件在哪
需要把调度逻辑下沉到更靠近运行时的层:
-
Crane-Scheduler:在 Kubernetes 层基于 Prometheus 抓取的真实 CPU/Memory 使用率做 Pod 调度,影响的是容器部署位置,不是 Composer 行为; -
Laravel Horizon:通过 Redis 的INFO命令获取used_memory_rss和connected_clients,动态调整 worker 数量(如horizon:supervisor --max-workers=auto); - 自定义 CLI 调度器:用
sys_getloadavg()+posix_getpgid()判断当前负载,在post-autoload-dump后触发不同策略脚本。
如何让 Composer “配合”实时调度(实操建议)
虽然 Composer 不调度,但你可以用它“准备调度所需的上下文”:
- 在
composer.json中用"platform"显式声明目标环境负载特征,例如:"platform": { "php": "8.6", "ext-opcache": "8.6.0", "ext-apcu": "6.0.0" }避免因扩展缺失导致后续调度器(如 Horizon)启动失败; - 把调度策略封装成可安装的包,例如
myorg/load-aware-worker,通过composer require myorg/load-aware-worker注入调度逻辑; - 在
scripts中绑定钩子:"scripts": { "post-install-cmd": [ "@php artisan horizon:publish-config", "bash ./bin/adjust-workers.sh" ] }其中adjust-workers.sh可读取cat /proc/loadavg | awk '{print $1}'并写入配置文件供 Horizon 读取。
真正容易被忽略的一点是:很多人试图给 Composer 加“实时”标签,其实是混淆了**依赖供给阶段**和**运行时调度阶段**。前者决定“有哪些轮子”,后者决定“哪个轮子此刻该转”。轮子清单不会随胎压变化而重印,但胎压传感器必须装在车上——这个传感器,从来不在 Composer 里。



















