PHP 连不上 Redis 首先需确认 redis 扩展是否已启用:运行 php -m | grep redis,有输出说明已加载;否则检查 php.ini 中 extension 配置及是否重启服务,并注意 CLI 与 Web 环境配置差异。

确认 PHP 是否已启用 redis 扩展
连不上 Redis,八成是 redis 扩展根本没装或没启用。别急着改配置,先验证环境:
- 运行
php -m | grep redis,有输出说明扩展已加载;没输出就继续往下查 - 检查
php.ini是否包含extension=redis(Linux/macOS)或extension=php_redis.dll(Windows) - 注意:有些系统会分
cli和fpm两套配置,phpinfo()页面看到的Loaded Configuration File路径才是 Web 环境实际读取的 - 重启 PHP-FPM 或 Apache 后再测试,仅改
php.ini不重启无效
用 PhpRedis 连接 Redis 的基础写法
不是所有项目都用 Laravel,原生 PHP + Redis 类最直接。关键点不在“怎么连”,而在“连错时怎么定位”:
-
$redis = new Redis();实例化后必须调用connect()或pconnect(),否则后续操作全抛RedisException: Connection refused - 连接失败不等于代码报错——默认静默失败,得手动加
try/catch或检查connect()返回值:if (!$redis->connect('127.0.0.1', 6379, 2)) { die('Redis connect failed'); } - 端口、密码、数据库索引(
select(0))必须和redis.conf里一致;密码错误不会报“auth failed”,而是后续命令返回NOAUTH Authentication required - 本地开发常用
127.0.0.1,但 Docker 容器里要用宿主网关或服务名(如host.docker.internal或redis),不能写localhost
在 ThinkPHP 中配置 Redis 并验证是否生效
ThinkPHP 自带 Redis 驱动,但配置项藏得深,且不同版本 key 名不一致:
- TP6 在
config/cache.php里配'type' => 'redis',同时确保'redis' => [...]子数组存在,而非只写'host'等顶层字段 - 常见漏配项:
'port'(默认 6379)、'password'(空字符串也要显式写'')、'select'(默认 0,但若 Redis 里没用过 db0 可能为空) - 别依赖
Cache::get()返回值判断连通性——缓存未命中也返回null。改用Cache::store('redis')->handler()->ping(),成功返回+PONG - 如果用的是
think-queue,它默认走cache配置,但队列驱动需单独在config/queue.php里设'default' => 'redis',否则仍走 file 驱动
连接超时与长连接的实际影响
线上 Redis 连接偶尔失败?大概率不是网络问题,而是连接管理不当:
立即学习“PHP免费学习笔记(深入)”;
-
connect()是短连接,每次请求新建 TCP 连接;pconnect()复用连接,但 PHP-FPM 模式下进程复用可能导致连接被意外关闭,需配合setOption(Redis::OPT_SCAN, Redis::SCAN_RETRY)防断连 - 超时参数要分清:
connect($host, $port, $timeout)的$timeout单位是秒(浮点数),而setOption(Redis::OPT_READ_TIMEOUT, 0.5)控制读超时,单位是秒但支持小数 - Docker 或云 Redis(如阿里云 KVR)常限制空闲连接时长(如 300 秒),
pconnect()容易触发强制断开,此时应捕获RedisException并重试,而不是让整个请求崩掉 - 高并发下大量
new Redis()可能打满本地端口,用连接池(如co\redis或 Swoole 的Coroutine\Redis)更稳,但那是另一层架构问题了
真正卡住人的,往往不是“怎么写第一行代码”,而是 Redis 连上了却读不到数据、或者连上五分钟后突然开始报错——这时候得翻 redis-cli monitor 看命令流,而不是反复改 PHP 配置。











