背景
項目由於併發很高,所以將之前連接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
參考文章: