PHP集成Redis缓存的核心是确保redis扩展启用、php.ini正确加载、框架层调用真实Redis实例而非file/array模拟;需验证CLI与Web环境php.ini一致,Laravel需配置database.php和cache.php并清缓存,ThinkPHP6需完整设置password和select,原生项目须加超时与异常处理。

PHP 主流架构(Laravel、ThinkPHP、原生 PDO 项目)集成 Redis 缓存,核心不是“能不能连上”,而是 redis 扩展是否启用、php.ini 是否加载、以及框架层是否正确调用 Redis 实例而非仅靠 file 或 array 驱动模拟。
确认 PHP 环境已启用 redis 扩展
很多“配置失败”实际卡在底层扩展没装好。运行 php -m | grep redis,无输出说明扩展未启用;有输出但 Laravel 报 Class 'Redis' not found,大概率是 CLI 和 Web SAPI 使用了不同 php.ini。
- CLI 下执行
php --ini查看加载的配置路径,Web 环境中建一个info.php写 ,搜索Loaded Configuration File对比是否一致 - Ubuntu/Debian 常见路径:
/etc/php/*/cli/php.ini和/etc/php/*/apache2/php.ini(或fpm/php.ini)需分别添加extension=redis.so - Mac M1/M2 用户用 Homebrew 安装时,注意扩展路径可能是
/opt/homebrew/lib/php/pecl/.../redis.so,需在php.ini中写绝对路径
Laravel 中配置 Redis 并启用缓存驱动
Laravel 默认用 file 驱动,改 Redis 不只是改 .env,还要确保 cache.php 中 redis 连接存在且被引用。
-
.env中必须设置:REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379 REDIS_DB=0
- 检查
config/database.php的redis配置块,确认default连接指向了正确的host/port,且database值是整数(不是字符串"0") - 修改
config/cache.php中'default' => env('CACHE_DRIVER', 'file')为'default' => env('CACHE_DRIVER', 'redis'),并确保'stores.redis.connection'指向database.redis.default定义的连接名 - 执行
php artisan config:clear,否则.env修改不生效
ThinkPHP 6+ 使用 redis 缓存的实际配置点
TP6 的 cache.php 默认只配了 type 和 host,但生产环境常因缺少 auth 或 select 导致写入成功、读取为空。
立即学习“PHP免费学习笔记(深入)”;
- 完整 Redis 缓存配置示例(
config/cache.php):'redis' => [ 'type' => 'redis', 'host' => env('REDIS_HOST', '127.0.0.1'), 'port' => env('REDIS_PORT', 6379), 'password' => env('REDIS_PASSWORD', ''), 'select' => env('REDIS_DB', 0), 'timeout' => 0, 'expire' => 3600, ], - 若 Redis 启用了密码但
password设为空字符串(''),TP 会跳过认证;必须设为null才真正忽略密码字段 - 使用
Cache::store('redis')->get('key')显式指定 store,避免因默认 store 是file导致误判
原生 PHP 项目手动实例化 Redis 的安全写法
不用框架时,直接 new Redis() 很容易忽略连接异常和超时控制,导致请求卡死。
- 基础连接应带 try/catch 和超时:
$redis = new Redis(); try { $redis->connect('127.0.0.1', 6379, 2.0); // 第三个参数是超时秒数 $redis->setOption(Redis::OPT_PREFIX, 'myapp:'); } catch (RedisException $e) { error_log('Redis connection failed: ' . $e->getMessage()); return false; } - 不要在循环里反复 new
Redis();建议封装成单例或使用连接池(如predis/predis的Predis\Client支持连接复用) -
set时务必加过期时间,原生$redis->set('k', 'v')是永不过期的,等价于setex才安全:$redis->setex('k', 3600, 'v')
Redis 集成最常被忽略的是:扩展加载路径不一致、框架缓存配置与数据库配置分离、以及原生项目中缺乏连接超时和异常兜底。这些点不解决,光改 .env 或 cache.php 没用。











