composer remove 对 PHP 扩展无效,因其仅管理 vendor 下的 PHP 类库,不涉及 .so/.dll 二进制扩展;ext-redis 等是平台约束而非可卸载包,卸载需用 pecl uninstall、系统包管理器或手动修改 php.ini 并重启服务。

Composer 的 remove 命令不处理 PHP 扩展,它只管理 Composer 包(即 vendor/ 下的 PHP 类库),和 extension=redis.so 这类 Zend 扩展完全无关。想靠 composer remove ext-redis 卸载 redis.so?会报错或静默失败。
为什么 composer remove 对 PHP 扩展无效
PHP 扩展是 C 编写的二进制模块(.so 或 .dll),由 PHP 解析器在启动时通过 php.ini 加载;而 Composer 管理的是纯 PHP 的依赖包,运行在 PHP 用户态,无权、也无法干预扩展的加载流程。
常见误解场景:
- 看到
ext-redis出现在composer.json的require里,误以为它是可卸载的“包”——其实它只是个平台约束(platform package),用于声明“本项目需要系统已启用 redis 扩展”,不提供任何代码 - 执行
composer remove ext-redis后php -m | grep redis仍显示加载中——因为根本没动php.ini和redis.so - 删掉
ext-redis后 CI 报错 “Class 'Redis' not found”——不是 Composer 没卸干净,而是 PHP 环境本身还开着 redis 扩展,但你的代码逻辑可能已移除相关调用,导致类型检查失败
真正该用什么命令卸载 PHP 扩展
取决于扩展安装方式,没有统一命令,必须对症下药:
立即学习“PHP免费学习笔记(深入)”;
- 用
pecl install装的:运行pecl uninstall redis(它只删.so和package.xml,php.ini中的extension=redis.so行需手动注释) - 用系统包管理器装的(如
apt install php-redis):必须用对应命令卸载,sudo apt remove php-redis(Debian/Ubuntu)或sudo yum remove php-pecl-redis(RHEL/CentOS) - 宝塔面板安装的:进「软件商店」点「卸载」按钮,再手动删
/www/server/php/{版本}/lib/php/extensions/no-debug-non-zts-*/redis.so并注释php.ini - 手动编译安装的:先注释
php.ini中的extension=行,再rm /path/to/redis.so,最后重启 PHP-FPM 或 Apache
卸载后必须验证的三件事
改完配置 ≠ 扩展已停用。PHP 有缓存、多配置文件、多 SAPI(CLI/FPM/Apache)等干扰项:
- 确认生效的是你改的那个
php.ini:php --ini查路径,php -r "echo php_ini_loaded_file();"再核对一次 - 分环境验证:
php -m | grep redis(CLI)、php-fpm -m | grep redis(FPM)、建phpinfo()页面查 Web 环境 - 警惕 opcache 缓存残留:若卸载后仍报
Class not found,不是配置没生效,而是opcache.validate_timestamps=0导致旧字节码还在用——执行opcache_reset()或直接重启 PHP-FPM
最常被忽略的是:同一个服务器上 CLI 和 FPM 的 php.ini 完全独立,改了 /etc/php/8.2/cli/php.ini 不代表 FPM 就停用了扩展。别只跑 php -m 就收工。



















