常驻命令队列mysql连接超时的处理办法

1,常驻命令队列长时间没访问再次有消息消费时,会报错

PDO::prepare(): send of 131 bytes failed with errno=32 Broken pipe

这是因为mysql服务端自动断开socket,mysql的socket timeout超过8小时(默认)会自动断开已建立的tcp连接

但由于是常驻命令,程序认为connection连接还存在,进行mysql操作就会报错。

2,两种解决办法(laravel)

优化BaseModel

<?php

use Illuminate\Database\Eloquent\Model as Eloquent;

class BaseModel extends Eloquent
{
    protected static $lastConnectTime = null;

    public function __construct(array $attributes = [])
    {
        parent::__construct($attributes);

        if (!is_null(self::$lastConnectTime)) {
            //4小时重连
            if ((time() - $lastConnectTime) > 14400) {
                self::getConnection()->reconnect();
            }
        } else {
                self::$lastConnectTime = time();           
        }
    }
}

重写 Illuminate\Database\DetectsLostConnections中的causedByLostConnection方法

Illuminate\Database\Connection中执行m

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章