Laravel 6.0 的 predis 和 phpredis 冲突的原因

问题

:exclamation:一直报错:laravel Non-static method Redis::hGet() cannot be called statically
如下图所示:point_down:
Laravel 6.0 的 predis 和 phpredis 冲突的原因

原因

排查了原因如下:point_down:

  1. 要么用 predis
  2. 要么用 phpredis

有什么区别

先了解 PEARPECL

:point_right:参考文章: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:

  1. 代码是 clone 的,已有依赖包 predis/predis。我想换 phpredis (有强迫症所以删了这个依赖)
  2. 安装环境的时候我习惯先装 Redis,所以和 predis/predis 冲突了

use Redisuse 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 扩展已安装

Laravel 6.0 的 predis 和 phpredis 冲突的原因

2. 移除 predis

# 强迫症,我移除 predis,只保留 phpredis
composer remove predis/predis

3. 编辑 .env

详情看 Redis 文档配置

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 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!