当请求数量比较大的时候会报。redis 链接异常

codeninjia

正常使用没问题。我本地压测也没出现这个错误。redis的腾讯云的redis 集群。

服务器上会出现这个错误。很少但是会出现。
参考网上示例。把read_write_timeout 改成了0 还是不行。想问下大大,可能是什么原因。跟workerman多进程切换有关系吗
Predis\Connection\AbstractConnection::onConnectionError code:0 msg:Error while reading line from the server.

4945 4 0
4个回答

six

怎么感觉是腾讯云redis 集群的问题

  • codeninjia 2018-07-16

    现在不确定。我试试本地连接腾讯云试试

damao

redis服务端有个timeout配置,是用来关闭不活跃reids连接的,设置成0试下

  • codeninjia 2018-07-16

    恩我在github看到了一个答案是说

    If you are using Predis in a daemon-like script you should set read_write_timeout to -1 if you want to completely disable the timeout (this value works with older and newer versions of Predis). Also, remember that you must disable the default timeout of Redis by setting timeout = 0 in redis.conf or Redis will drop the connection of idle clients after 300 seconds of inactivity.

    说如果守护进程的话使用predis的话要改成-1.

  • damao 2018-07-16

    Also, remember that you must disable the default timeout of Redis by setting timeout = 0 in redis.conf
    我说的是这个,redis服务端的配置

  • codeninjia 2018-07-16

    @16:这个啊我看看。这个值是用来关闭不活跃的链接的。如果设置为0 的话意思是不在关闭不活跃的链接对吧?那这样对性能会有影响吗。我是否可以在我每次我处理完一个请求之后我程序手动关闭当前使用的redis 链接?

  • damao 2018-07-16

    可以手动关闭啊

  • codeninjia 2018-07-16

    @16:怎么关闭我在文档里没看到。能给下提示吗

  • codeninjia 2018-07-16

    @16:直接disconnect 就行是吧

  • damao 2018-07-16

    额,我没用过Predis

  • codeninjia 2018-07-16

    @16:感觉不行啊。redis已经设置了timeout=0.还是有报错。手动关闭的话感觉也有点问题

walkor 打赏

在onWorkerStart里初始化redis,千万不要在onWorkerStart执行前就初始化,onWorkerStart执行前初始化redis的redis连接属于主进程,fork的子进程会自动继承主进程的这个redis连接,这样会导致多个子进程都可以对同一个redis连接进行读写,导致数据错乱。

  • codeninjia 2018-07-19

    我是在
    $http_worker->onWorkerStart = function($http_worker) {
    // init app
    App::init();
    };
    onWorkerStart 里初始化的单例的redis。平时不会有问题。就是请求量多的时候会报上面那个错。

phpcreeper

其实和这个问题类似: http://wenda.workerman.net/?/question/2697

  • 暂无评论
年代过于久远,无法发表回答
×
🔝