Laravel 6.0 的 predis 和 phpredis 冲突的原因
问题
一直报错:laravel Non-static method Redis::hGet() cannot be called statically
如下图所示
原因
排查了原因如下
- 要么用
predis
- 要么用
phpredis
有什么区别
先了解 PEAR
和 PECL
参考文章:blog.csdn.net/beyond__devil/articl...
PEAR
predis
属于这种,是使用纯 PHP 写的
PHP 扩展与应用库(the PHP Extension and Application Repository) 是一个 PHP 扩展及应用的代码仓库,纯粹由 PHP 代码编写。就是别人帮我们用 PHP 写了一些工具,图像处理、文件上传等,我们直接在我们项目中使用即可。
PEAR 是 PHP 的上层扩展,用 PHP 来写的扩展
PECL
phpredis
属于这种,是使用 C 写的 PHP 扩展
PHP 扩展库(PHP Extension Community Library) 提供了一系列已知的扩展库,由 C、C++ 等其他语言编写,以 ‘.so’ 形式出现。’.so’ 为共享库,是 share object,用于动态链接。和 ‘dll’ 差不多,比 ‘PEAR’ 更快。(因为非 PHP 代码,需要在服务器上配置并注册到主机中)
PECL 是 PHP 的底层扩展,PHP 可能不支持的一些操作系统底层的功能,通过 C 写个扩展,对 PHP 语言本身,进行了扩充
解决
我选择用
phpredis
:
- 代码是 clone 的,已有依赖包
predis/predis
。我想换phpredis
(有强迫症所以删了这个依赖)- 安装环境的时候我习惯先装 Redis,所以和
predis/predis
冲突了
use Redis
和use Illuminate\Support\Facades\Redis
:
- 直接
use Redis
是调用 php redis 扩展 Redis 类(就是上面说的用 C 写的 PHP 扩展),非 Larave 提供的Illuminate\Support\Facades\Redis
类;- 如果装了这个 Redis 扩展,可以在
php.ini
中删除 Redis 扩展的配置,然后再用use Redis
,此时使用的是Illuminate\Support\Facades\Redis
类了;
1. 先检查 Redis 扩展已安装
2. 移除 predis
# 强迫症,我移除 predis,只保留 phpredis
composer remove predis/predis
3. 编辑 .env
REDIS_HOST=redis
REDIS_PASSWORD=null
REDIS_PORT=6379
# REDIS_CLIENT=predis 修改为 REDIS_CLIENT=phpredis
REDIS_CLIENT=phpredis
4. 编辑 config/app.php
/**
* 其实删不删,改不改这行没影响的,项目直接用 Illuminate\Support\Facades\Redis 这个类
*
* 主要是强迫症,我还是选择删掉这行
*
* 可以选择更改别名为「RedisManager」留着备用,或者「其他任意名称,如: RedisDB, RedisA ...」
*/
// 'Redis' => Illuminate\Support\Facades\Redis::class, # 找到这行
'RedisManager' => Illuminate\Support\Facades\Redis::class, # 修改后的
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: