PHP连接Redis需先确认redis扩展已启用,再用new Redis()连接;注意版本兼容性、密码认证、异常捕获及序列化策略,避免混淆phpredis与Predis。

确认 PHP 是否已加载 redis 扩展
运行 php -m | grep redis,如果无输出,说明扩展未安装或未启用。别急着重装,先检查 php.ini 是否漏加了 extension=redis(Linux/macOS)或 extension=php_redis.dll(Windows)。注意:PHP 8.0+ 不再兼容旧版 phpredis 5.x,必须用 6.0+;若用的是 phpiredis(C 库封装),那根本连不上——phpredis 和 predis 是两套东西,前者是 C 扩展,后者是纯 PHP 库,不能混为一谈。
用 phpredis 扩展连接 Redis 实例
扩展装好后,直接 new Redis 类即可,不需 Composer 加载。常见错误是没捕获异常导致白屏:
try {
$redis = new Redis();
$redis->connect('127.0.0.1', 6379, 2.5); // 第三个参数是超时秒数,别设 0
$redis->set('test_key', 'hello_redis');
echo $redis->get('test_key');
} catch (RedisException $e) {
error_log('Redis error: ' . $e->getMessage());
}
要点:
-
connect()默认不启用密码认证;若 Redis 配了requirepass,得紧接调用$redis->auth('your_password') - 生产环境建议用
connect()而非pconnect(),后者在 FPM 模式下易引发连接残留和端口耗尽 - 连接失败不会抛出异常,除非显式开启
throw_redis_errors配置项(在php.ini中设redis.session.lock_retries=0并配合redis.clusters.seeds等高级配置时才需深究)
验证 redis 扩展是否支持 Redis Cluster 或哨兵
phpredis 4.3.0+ 支持 Cluster,但不是所有方法都可用:get()、set() 可用,keys() 这类全局命令会报错 CROSSSLOT Keys in request don't hash to the same slot。判断是否启用了集群模式,看构造时传参:
立即学习“PHP免费学习笔记(深入)”;
// 单机
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
// Cluster(需 phpredis ≥ 4.3.0)
$redis = new RedisCluster(null, ['127.0.0.1:7000', '127.0.0.1:7001']);
// 注意:RedisCluster 构造函数第一个参数是 seed nodes 列表,不能传空字符串
哨兵支持更弱,phpredis 官方不原生支持 Sentinel 自动故障转移,得自己写逻辑轮询 SENTINEL get-master-addr-by-name 结果再 reconnect。
缓存使用中容易被忽略的序列化问题
phpredis 默认用 serialize() 存数组/对象,但如果你在 PHP 7.4+ 里存了含 DateTime 的结构,取出来可能反序列化失败——因为 DateTime 在某些版本序列化格式不兼容。解决办法是改用 igbinary(需额外装扩展并启用 redis.serializer = igbinary)或手动 JSON 化:
$data = ['ts' => date('c'), 'user_id' => 123];
$redis->set('cache:user:123', json_encode($data));
// 取出后要 json_decode(..., true)
另外,setex() 和 set(..., [..., 'ex' => 3600]) 效果一样,但后者是 Redis 2.6.12+ 的新语法,PHP 扩展对两种写法都支持;不过用数组参数方式更易读,也方便动态拼 TTL。
Predis\Client 的用法套到 Redis 类上。多看 phpinfo() 里 redis 模块那一栏的版本号,比查文档还管用。











