程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> Yii2-Redis使用小記,yii2-redis小記

Yii2-Redis使用小記,yii2-redis小記

編輯:關於PHP編程

Yii2-Redis使用小記,yii2-redis小記


前些天簡單學習了下 Redis,現在准備在項目上使用它了。我們目前用的是 Yii2 框架,在官網搜索了下 Redis,就發現了yii2-redis這擴展。

安裝後使用超簡單,打開 common/config/main.php 文件,修改如下。

'cache' => [
    // 'class' => 'yii\caching\FileCache',
    'class' => 'yii\redis\Cache',
],
'redis' => [
    'class' => 'yii\redis\Connection',
    'hostname' => 'localhost',
    'port' => 6379,
    'database' => 0,
],

OK,現在已經用 redis 接管了yii的緩存,緩存的使用和以前一樣,以前怎麼用現在還是怎麼用,但是有個不算bug的bug,所以算小坑,等會會說。

來測試下 cache 先,

Yii::$app->cache->set('test', 'hehe..');
echo Yii::$app->cache->get('test'), "\n";

Yii::$app->cache->set('test1', 'haha..', 5);
echo '1 ', Yii::$app->cache->get('test1'), "\n";
sleep(6);
echo '2 ', Yii::$app->cache->get('test1'), "\n";

來看下測試結果。

和原來一樣的用法,沒問題。。

但是剛才我說過了有個不算bug的bug,所以算小坑,到底是什麼東西呢?
如果你直接用 redis 接管了 cache,如果正常使用是完全沒問題的,但是當 過期時間 的值超過 int 范圍的時候,redis就會報錯。
我使用了 yii2-admin,湊巧讓我踩到坑了,因為他緩存了30天,也就是2592000秒,並且 redis 緩存時間精度默認用毫秒,所以時間就是 2592000000 毫秒。
而 redis 的過期時間只能是int類型,Cache.php 裡的 php 強制轉為int,而沒有做其他處理,所以就會變成 -1702967296 然後就報錯了。

但是直接在 redis 命令行下不會負數,如圖。

不過沒關系,修復起來也很簡單,我們修改為秒即可。
打開 vendor/yiisoft/yii2-redis/Cache.php 第 133 行,修改為如下代碼。

protected function setValue($key, $value, $expire)
{
    if ($expire == 0) {
        return (bool) $this->redis->executeCommand('SET', [$key, $value]);
    } else {
        // $expire = (int) ($expire * 1000); // 單位默認為毫秒
        // return (bool) $this->redis->executeCommand('SET', [$key, $value, 'PX', $expire]);

        $expire = +$expire > 0 ? $expire : 0; // 防止負數
        return (bool) $this->redis->executeCommand('SET', [$key, $value, 'EX', $expire]); // 按秒緩存
    }
}


這樣就OK了。

好了,今天分享這些,明後天會說下 yii2-redis 的 Connection 和 ActiveRecord 以及小坑。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved