Laravel 6.0 的 predis 和 phpredis 衝突的原因

wonderfate發表於2020-04-27

: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 協議》,轉載必須註明作者和本文連結

相關文章