关于Gateway数据库连接问题

abcde123456

关于数据库这样实例化多次mysql连接性能上会不会比只实例化一次好点

class Events
{
    public static $db = ;
    /**
    * 进程启动后初始化数据库连接
    */
    public static function onWorkerStart($worker) {
        for ($i=0;$i<20;$i++) {
            self::$db = new Connection("172.17.0.2", 3306, "backup", "123456", "test");
        }
    }

    // 使用
    self::$db->select("*")->from("test")->query();

你们是怎么用的 你们是不是做了数据库连接池? 有没有demo 给我参考下, 谢谢大神们
 
 
 
 
其实我知道上面这种方式不妥
 
应为php是单进程 多少客户端连接就会产生多少个进程 
用gateway的话 服务都是交给businessworker这个进程处理 
所以有没有办法把 数据库连接交给businessworker这个进程 Events 直接让businessworker 去操作数据库 这样是不是就能再businessworker上做连接池呢? 
 
还要个问题就是每个worker进程 是通过什么形式维护各自连接的多个客户端的?不同客户端直接的信息是怎样分割开来的?

3025 2 0
2个回答

taozywu

@https://wenda.workerman.net/people/abcde123456 

首先你说的“关于数据库这样实例化多次mysql连接性能上会不会比只实例化一次好点”,你是怎么判断的?

其次请仔细阅读手册10、支持对象或者资源永久保持
WorkerMan在运行过程中只会载入解析一次PHP文件,然后便常驻内存,这使得类及函数声明、PHP执行环境、符号表等不会重复创建销毁,这与Web容器下运行的PHP机制是完全不同的。在WorkerMan中,一个进程生命周期内静态成员或者全局变量在不主动销毁的情况下是永久保持的,也就是将对象或者连接等资源放到全局变量或者类静态成员中则当前进程的整个生命周期内的所有请求都可以复用。例如只要单个进程内初始化一次数据库连接,则以后这个进程的所有请求都可以复用这个数据库连接,避免了频繁连接数据库过程中TCP三次握手、 数据库权限验证、断开连接时TCP四次握手的过程,极大的提高了应用程序效率。

  • 暂无评论
six

应为php是单进程 多少客户端连接就会产生多少个进程

这个说法貌似是错的。php默认是多进程单线程的吧。
另外有多少个客户端连接就产生多少进程这个说法也不对。我的理解是一个进程可以处理多个连接,连接数不影响服务端进程数。

  • workerman_99 2021-11-17

    放到队列里面,再唤醒子进程来处理连接

年代过于久远,无法发表回答
🔝