workerman的优点中有一条“数据或者资源可以全局共享”,请问怎么实现?我想在Event.php中用mysql_connect()创建一个数据连接$db_conn,然后后面有新的连接进来时,可以不用再次连接,如何做?是否用一个在Event 或者Gateway class中声明一个static $db_conn = null,然后做一个初始化就行了?
可以写一个数据库的类,然后使用单例模式,类似下面这样
class DB { static $dbConn = null; public static function instance() { if(!self::$dbConn) { self::$dbConn = new PDO(xxxx); } } }
数据库资源全局共享时有一点需要注意,当这个共享的数据库链接长时间没有任何操作时可能会被mysql服务端关闭链接,被mysql服务端关闭链接后的数据库资源再次被使用的时候会报mysql gone away 错误,使用时如果遇到这种错误(错误码为2006)重连即可
那是不是我使用MYSQL_PCONNECT 可以避免这种断开连接后的判断了。每次用户名密码一样用相同的句柄链接?
如果用持久的mysql资源,都会有服务端关闭不活跃链接的问题,都需要判断。
对性能要求不高的应用可以不使用持久资源。每次使用数据库重新创建一个链接
学习了。那redis用单例模式加载的话 会不会也存在myql gone away需要重连这类似问题。
redis底层会自动重连,但是按照经验来看,redis扩展底层的重连并十分不可靠,还是有连不上的状况。最好是在底层判断下异常,然后重连重试一次。
可以写一个数据库的类,然后使用单例模式,类似下面这样
数据库资源全局共享时有一点需要注意,当这个共享的数据库链接长时间没有任何操作时可能会被mysql服务端关闭链接,被mysql服务端关闭链接后的数据库资源再次被使用的时候会报mysql gone away 错误,使用时如果遇到这种错误(错误码为2006)重连即可
那是不是我使用MYSQL_PCONNECT 可以避免这种断开连接后的判断了。每次用户名密码一样用相同的句柄链接?
如果用持久的mysql资源,都会有服务端关闭不活跃链接的问题,都需要判断。
对性能要求不高的应用可以不使用持久资源。每次使用数据库重新创建一个链接
学习了。那redis用单例模式加载的话 会不会也存在myql gone away需要重连这类似问题。
redis底层会自动重连,但是按照经验来看,redis扩展底层的重连并十分不可靠,还是有连不上的状况。最好是在底层判断下异常,然后重连重试一次。