Composer 不编译 C 扩展,仅管理 PHP 包并校验运行时依赖;需先通过系统工具链(如 php-dev+phpize)或 PECL 编译启用扩展(如 swoole、redis),再在 composer.json 中声明 ext-xxx 依赖。

Composer 本身不编译 C 扩展,它只管理 PHP 包的下载、安装和自动加载。处理需要编译的 C 扩展(如 ext-redis、ext-swoole、ext-protobuf 等),关键在于**先让扩展在系统中可用(已编译并启用)**,再让 Composer 检查或声明依赖。
明确依赖类型:runtime vs. build-time
Composer 的 require 中写的 "ext-xxx" 是运行时依赖(runtime requirement),它只是告诉 Composer:“这个扩展必须已存在并启用,否则 install/update 会失败”。它不会帮你装或编译。
-
runtime 依赖:写在
composer.json的require里,例如"ext-redis": "*"—— Composer 仅做检查,不参与编译 -
build-time 工具:如
phpize、gcc、make、对应扩展的源码或开发包(如php-dev、libssl-dev)—— 这些需手动或通过脚本准备
典型流程:编译 → 启用 → 声明
以 swoole 为例(从源码编译):
- 确保已安装 PHP 开发头文件:
apt install php-dev(Debian/Ubuntu)或yum install php-devel(CentOS/RHEL) - 下载 Swoole 源码,进入目录后执行:
phpize && ./configure && make && sudo make install - 编辑
php.ini,添加:extension=swoole - 重启 PHP-FPM 或 Web 服务器,运行
php -m | grep swoole确认已加载 - 此时才能在
composer.json中安全声明:"ext-swoole": "*"
用 PECL 快速安装(推荐多数场景)
PECL 是 PHP 官方扩展仓库,自带编译逻辑,比手动更可靠:
- 运行
pecl install redis(自动下载、编译、安装redis.so) - PECL 通常会提示你是否写入
php.ini;若没写,手动加一行extension=redis - 验证:
php -i | grep "redis version" - 之后 Composer 就能通过
"ext-redis": "*"成功校验
CI/CD 或 Docker 中自动化处理
在构建镜像或部署流水线中,把编译步骤写进脚本或 Dockerfile:
RUN apt-get update && apt-get install -y php-dev libssl-dev && rm -rf /var/lib/apt/lists/*
RUN pecl install redis swoole && docker-php-ext-enable redis swoole
Docker 官方 PHP 镜像提供了 docker-php-ext-configure、docker-php-ext-install、docker-php-ext-enable 等便捷命令,适合定制扩展。
基本上就这些:Composer 不碰编译,编译靠系统工具链或 PECL,Composer 只负责“确认它已就位”。只要扩展在 php -m 里可见,Composer 就能继续往下走。










