Composer不提供Redis扩展,需手动启用redis.so或使用predis/predis;phpredis/phpredis仅是声明依赖的空包,不安装扩展;框架中需统一客户端类型避免行为差异。

Composer 本身不提供 Redis 扩展插件,它只负责安装 PHP 类库(如 predis/predis 或 phpredis 的封装包),而真正的 Redis 扩展(redis.so)必须由 PHP 环境原生编译加载。 直接运行 composer require 不会让 $redis->connect() 突然可用——PHP 进程得先认得 Redis 这个类,而这依赖于扩展是否启用。
确认 PHP 是否已启用 redis 扩展
这是最容易跳过的一步,也是 80% “明明装了却报 Class not found” 的根源。运行:
php -m | grep redis
若无输出,说明 PHP 还没加载 redis 扩展。此时:
• Linux(源码编译 PHP):需执行 pecl install redis,再在 php.ini 中添加 extension=redis.so
• macOS(Homebrew):用 brew install php@8.2-redis(版本对齐你的 PHP)
• Windows:下载对应 PHP 版本和线程安全标识(TS/NTS)的 php_redis.dll,放入 ext/ 目录并修改 php.ini
改完重启 Web 服务或 CLI,再验证 php --ri redis 是否显示配置信息。
composer require predis/predis(纯 PHP 实现,无需扩展)
如果你无法控制服务器环境(如共享主机、某些容器)、或只是做轻量缓存/测试,predis/predis 是最稳妥的选择。它完全用 PHP 写成,不依赖 redis.so。
- 运行
composer require predis/predis,完成后会自动加载 PSR-4 自动加载规则 - 代码中直接 new 客户端:
$client = new \Predis\Client([ 'scheme' => 'tcp', 'host' => '127.0.0.1', 'port' => 6379, ]); - 注意:Predis 默认不支持 Redis 7+ 的部分新命令(如
FCALL),且长连接复用、管道性能略低于原生扩展
composer require phpredis/phpredis(官方扩展的 Composer 封装)
phpredis/phpredis 这个包名是误导性极强的“坑”。它**不是**扩展本身,只是一个空的 Composer 包,仅用于声明依赖关系,**不会安装任何 C 扩展**。
- 你执行
composer require phpredis/phpredis后,new Redis()依然会报错 —— 因为 PHP 还没加载扩展 - 它的唯一作用是配合
ext-redis声明,让composer install在扩展缺失时失败(CI 场景有用) - 正确做法是:先确保
redis.so已启用;然后可选加一行到composer.json的require:"ext-redis": "*"
,这样 Composer 会在扩展未就绪时报明确错误
在 Laravel / Symfony 等框架中使用 Redis 类库
框架通常抽象了底层驱动,但前提是基础类存在。以 Laravel 为例:
- 如果用了
predis/predis,Laravel 会自动适配,无需额外操作 - 如果想用原生
Redis类(性能更好),必须保证:
–redis.so已启用
–config/database.php中'driver' => 'redis'对应的client设置为'phpredis'(默认是'predis')
–composer.json中建议显式声明"ext-redis": "*"防止部署遗漏 - 调用
Cache::get('key')或Redis::get('key')时,实际走的是框架封装,但底层仍依赖扩展或 Predis 实例
真正容易被忽略的点是:本地开发用 Predis,线上用 phpredis,结果因为命令行为差异(比如 pipeline 返回格式、序列化方式)导致缓存读写错乱。上线前务必统一客户端类型并覆盖测试。










