背景
項目由于并發很高,是以将之前連接配接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