最近使用 Swoole 在后台运行 Websocket 服务,运行一段时间之后,Laravel 会报以下错误:

1
Error while reading line from the server.

首先考虑到是否服务器的 TCP 出现异常了,于是查看了 TCP 的连接情况,发现 CLOSE_WAIT 状态的进程达到1000+以上;说明程序的逻辑确实有点问题,修改了程序的断开逻辑和修改内核参数 sysctl.conf 后,问题得到暂时解决,但是运行一段时间后,还是继续报这个错误了。

然后再考虑到 Laravel 和 Redis 的连接超时入手,因为 Laravel 与 Redis 的连接超时时间默认是60s的,所以另外的一种解决方案:

1.修改 Laravel 的 config/database.php 配置文件,找到 redis 的配置项,加上 read_write_timeout 参数:

1
2
3
4
5
6
7
8
9
10
'redis' => [
'cluster' => false,
'default' => [
'host' => env('REDIS_HOST', 'localhost'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => 0,
'read_write_timeout' => 0
],
],

2.修改 Redis 的 redis.conf 配置文件,找到 timeout 参数,改成0:

1
timeout=0

重启 Redis 生效。

通过上面的方案,问题得到解决。

参考:
https://github.com/nrk/predis/issues/32

最后更新: 2018年01月14日 12:02

原始链接: http://blog.minhow.com/articles/laravel/predis-error-reading/

× 请我吃糖~
打赏二维码