Composer 本身不支持编译安装 PHP 扩展,仅管理纯 PHP 依赖;可通过 scripts 钩子调用 pecl install 实现声明式集成,但需手动启用扩展并推荐在构建阶段预装而非部署时动态安装。

Composer 本身不支持编译安装 PHP 扩展(如 redis、grpc、protobuf 等需 C 代码编译的 PECL 扩展),它只管理纯 PHP 的依赖包。但你可以通过组合使用 pecl 和 Composer 的机制,实现“声明式”集成与自动化构建。
理解 Composer 和 PECL 的分工
Composer 负责 PHP 代码层的自动加载和依赖解析;PECL(PHP Extension Community Library)才是官方用于分发、编译、安装 C 扩展的工具。两者定位不同,不能互相替代。所谓“Composer 集成 PECL”,本质是借助 Composer 的脚本钩子(scripts)或构建流程,在安装依赖时自动调用 pecl install。
推荐做法:用 Composer scripts 触发 PECL 安装
在 composer.json 中定义 post-autoload-dump 或自定义命令(如 install-ext),在其中执行 pecl install。例如安装 redis:
- 确保系统已安装
php-dev(Ubuntu/Debian)或php-devel(CentOS/RHEL)、make、gcc等编译工具 - 确认
pecl命令可用(通常随 PHP 源码或包一起安装,路径类似/usr/bin/pecl) - 在
composer.json中添加脚本:
"install-redis-ext": "pecl install -f redis",
"post-autoload-dump": ["@install-redis-ext"]
}
运行 composer install 后,Composer 会在生成自动加载文件后自动执行 pecl install redis。
立即学习“PHP免费学习笔记(深入)”;
注意 extension 的启用与配置
PECL 安装完扩展后,仅把 .so 文件放入扩展目录(如 /usr/lib/php/20220829/),并不会自动写入 php.ini。你需要手动或脚本化启用:
- 检查扩展是否已加载:
php -m | grep redis - 若未出现,需在
php.ini中添加:extension=redis.so - 可配合
docker-php-ext-enable(Docker 官方镜像)或echo "extension=redis.so" > /usr/local/etc/php/conf.d/redis.ini自动配置
生产环境更稳妥的做法:分离构建与运行
不建议在部署时动态执行 pecl install(网络不稳定、权限受限、版本不可控)。推荐方式:
- Docker 构建阶段:在
Dockerfile中用docker-php-ext-install或pecl install编译安装扩展,再COPY应用代码 - CI/CD 流程中预编译:打包带扩展的 PHP 运行时镜像,应用镜像只
FROM它 - 本地开发用
phpbrew或asdf管理多版本 PHP + 扩展,避免污染系统 PHP
基本上就这些。Composer 不越界做编译的事,但可以成为触发和协调的“胶水”。关键还是理清 PECL 是编译层、Composer 是代码层,各司其职才稳。











