天天看點

解決PHP連接配接Redis報read error on connection錯誤

背景

項目由于并發很高,是以将之前連接配接redis使用短連接配接改成了長連接配接,結果導緻出現了抛出了read error on connection

出現原因

php有一個配置項default_socket_timeout表示一個socket連接配接的逾時時間,預設是60s,而phpredis這個擴充的底層連接配接redis是使用的socket,是以當一個連接配接在60秒内沒有被使用的時候,下次連接配接就會抛出這個異常。

解決方案

方案1 修改php.ini(不推薦)

在php.ini中設定default_socket_timeout = -1,然後重新開機php-fpm

方案2 程式中設定

使用ini_set函數

ini_set('default_socket_timeout', -1); // 不逾時

方案3 使用redis的option

在連接配接redis時setOption

$this->redis->setOption(Redis::OPT_READ_TIMEOUT, -1);

注意設定沒有逾時時間都要設定成-1 而不是0

參考文章:

https://github.com/phpredis/phpredis/pull/260