国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

關(guān)于webman文檔中推薦的redis問題

小陽光

截圖

按照官網(wǎng)配置redis,運(yùn)行一段時(shí)間后出現(xiàn)鏈接斷開問題,

Next RedisException: Connection closed in /abc/vendor/illuminate/redis/Connections/PhpRedisConnection.php:406

出現(xiàn)此問題,我測(cè)試會(huì)在兩種情況下出現(xiàn)

<?php

#default_socket_timeout為默認(rèn)值60
#第一種  
$rds = new \Redis();
try {
    $ret = $rds->connect("127.0.0.1", 6379);
    if ($ret == false) {
        echo "Connect return false";
        exit;
    }
    //設(shè)置超時(shí)時(shí)間為 0.1ms
    $rds->setOption(Redis::OPT_READ_TIMEOUT, 0.0001);
    var_dump($rds->get("user_count"));
} catch (Exception $e) {
    var_dump($e);
}

#第二種(運(yùn)行以下代碼,去手動(dòng)殺掉redis鏈接)
$rds = new Redis();
try {
    $ret = $rds->pconnect("127.0.0.1", 6379);
    if ($ret == false) {
        echo "Connect return false";
        exit;
    }
    while (1) {
        var_dump($rds->get("aa"));
    }

} catch (Exception $e) {
    var_dump($e);
}

第一種情況我們可以使用設(shè)置$rds->setOption(Redis::OPT_READ_TIMEOUT, -1); 不超時(shí)
或者修改default_socket_timeout為-1

但是第二種情況當(dāng)網(wǎng)絡(luò)出現(xiàn)閃斷的時(shí)候就避免不了,最好加一個(gè)短線重連。

我看illuminate/redis 7.X 并沒有短線重連功能,并且在配置文件里面 read_timeout 設(shè)置為 -1 會(huì)報(bào)錯(cuò),因?yàn)樗?$client->setOption(Redis::OPT_READ_TIMEOUT, $config['read_timeout']);

4609 5 0
5個(gè)回答

不敗少龍
  • 暫無評(píng)論
walkor 打賞

參考這個(gè)文檔給redis加一個(gè)定時(shí)心跳試下。
http://www.wtbis.cn/doc/webman#/db/heartbeat

  • 小陽光 2021-04-14

    redis正常的時(shí)候啟動(dòng)webman, 然后后把redis服務(wù)停掉,然后webman 再也連不上redis了,除非重啟webman
    加心跳也沒用。

  • 小陽光 2021-04-14

    這樣是不是可以說明手冊(cè)上的 redis不用自動(dòng)重連(redis底層已經(jīng)實(shí)現(xiàn)自動(dòng)重連)是錯(cuò)誤的

  • walkor 2021-04-15

    redis擴(kuò)展會(huì)自動(dòng)重連。你的問題應(yīng)該是連接被某個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)清理了,沒有通知客戶端(沒有發(fā)fin包),客戶端認(rèn)為連接仍然存活,繼續(xù)使用導(dǎo)致出錯(cuò)。比如用了阿里云的redis或者mysql服務(wù),redis連接和mysql連接都會(huì)因?yàn)殚L(zhǎng)時(shí)間不活躍被偷偷清理(不通知客戶端那種),客戶端不知道連接斷開就不會(huì)重連,導(dǎo)致讀寫超時(shí)。解決辦法就是定時(shí)加心跳,心跳間隔小于60秒。

  • 小陽光 2021-04-25

    redis擴(kuò)展里面的重連是,連續(xù)重試10次,再鏈接不上就不會(huì)重連了。

小陽光

這是我模擬網(wǎng)絡(luò)差的情況。網(wǎng)絡(luò)中斷一次,那么如果webman 依賴redis的服務(wù)就不可用了,除非重啟,我們開發(fā)的時(shí)候redis和webman用的一臺(tái)機(jī)器,所以沒有發(fā)現(xiàn)過此問題,但是我生產(chǎn)環(huán)境 redis 和webman 用的內(nèi)網(wǎng)不同服務(wù)器,就會(huì)有此問題。

  • 暫無評(píng)論
小陽光

我還聯(lián)想到webman中使用的rabbitmq會(huì)不會(huì)出現(xiàn)此類問題。

  • 暫無評(píng)論
小陽光
<?php

/**
 * This file is part of webman.
 *
 * Licensed under The MIT License
 * For full copyright and license information, please see the MIT-LICENSE.txt
 * Redistributions of files must retain the above copyright notice.
 *
 * @author    walkor<walkor@workerman.net>
 * @copyright walkor<walkor@workerman.net>
 * @link      http://www.wtbis.cn/
 * @license   http://www.opensource.org/licenses/mit-license.php MIT License
 */

namespace support\bootstrap;

use support\exception\BusinessException;
use Webman\Bootstrap;
use Illuminate\Redis\RedisManager;

class Redis implements Bootstrap
{

    /**
     * @var RedisManager
     */
    protected static $_manager = null;

    /**
     * @param \Workerman\Worker $worker
     * @return void
     */
    public static function start($worker)
    {
        if (!class_exists('\Illuminate\Redis\RedisManager')) return;
        $config = config('redis');
        static::$_manager = new RedisManager('', 'phpredis', $config);
        self::connection()->setOption(\Redis::OPT_READ_TIMEOUT, -1);  #這里設(shè)置為讀取不超時(shí)
    }

    /**
     * @param string $name
     * @return \Illuminate\Redis\Connections\Connection
     */
    public static function connection($name = 'default')
    {
        return static::$_manager->connection($name);
    }

    /**
     * @param $name
     * @param $arguments
     * @return mixed
     */
    public static function __callStatic($name, $arguments)
    {
        #這里修改為斷線后重新創(chuàng)建對(duì)象
        try {
            return static::$_manager->connection('default')->{$name}(... $arguments);
        } catch (\RedisException $ex) {
            self::start(null);
            log_write('redis 重新創(chuàng)建對(duì)象');
            return static::$_manager->connection('default')->{$name}(... $arguments);
        }
    }
}

如果遇到網(wǎng)絡(luò)閃斷,或者redis掛掉后恢復(fù)了,webman操作redis 任然報(bào)錯(cuò)問題。
這是我的解決方案,大家以后遇到可以參考

  • 暫無評(píng)論
年代過于久遠(yuǎn),無法發(fā)表回答
??