php如何连接redis_php连接redis扩展安装配置【缓存】

12次阅读

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

php如何连接redis_php连接redis扩展安装配置【缓存】

确认 PHP 是否已加载 redis 扩展

运行 php -m | grep redis,如果无输出,说明扩展未安装或未启用。别急着重装,先检查 php.ini 是否漏加了 extension=redislinux/macos)或 extension=php_redis.dllwindows)。注意:PHP 8.0+ 不再兼容旧版 phpredis 5.x,必须用 6.0+;若用的是 phpiredis(C 库封装),那根本连不上——phpredispredis 是两套东西,前者是 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。

Redis 连接本身不难,真正卡住人的往往是扩展版本和 PHP 版本不匹配、序列化策略没对齐、或者误把 PredisClient 的用法套到 Redis 类上。多看 phpinfo() 里 redis 模块那一栏的版本号,比查文档还管用。

text=ZqhQzanResources