关于“数据或者资源可以全局共享”

karllu

workerman的优点中有一条“数据或者资源可以全局共享”,请问怎么实现?我想在Event.php中用mysql_connect()创建一个数据连接$db_conn,然后后面有新的连接进来时,可以不用再次连接,如何做?是否用一个在Event 或者Gateway class中声明一个static $db_conn = null,然后做一个初始化就行了?

4555 5 0
5个回答

walkor

可以写一个数据库的类,然后使用单例模式,类似下面这样

class DB
{
    static $dbConn = null;
    public static function instance()
    {
        if(!self::$dbConn)
        {
            self::$dbConn = new PDO(xxxx);
        }
    }
}

数据库资源全局共享时有一点需要注意,当这个共享的数据库链接长时间没有任何操作时可能会被mysql服务端关闭链接,被mysql服务端关闭链接后的数据库资源再次被使用的时候会报mysql gone away 错误,使用时如果遇到这种错误(错误码为2006)重连即可

  • 暂无评论
ayamzh

那是不是我使用MYSQL_PCONNECT 可以避免这种断开连接后的判断了。每次用户名密码一样用相同的句柄链接?

  • 暂无评论
walkor

如果用持久的mysql资源,都会有服务端关闭不活跃链接的问题,都需要判断。

对性能要求不高的应用可以不使用持久资源。每次使用数据库重新创建一个链接

  • 暂无评论
ayamzh

学习了。那redis用单例模式加载的话 会不会也存在myql gone away需要重连这类似问题。

  • 暂无评论
walkor

redis底层会自动重连,但是按照经验来看,redis扩展底层的重连并十分不可靠,还是有连不上的状况。最好是在底层判断下异常,然后重连重试一次。

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