当前位置: 首页 > 后端技术 > PHP

一个php脚本执行过程中多次实例化PDO的场景分析

时间:2023-03-29 14:43:31 PHP

场景分析脚本代码:showprocesslist;+----+-----+-----------+-----+---------+------+----------+------------------+|Id|User|Host|db|Command|Time|状态|信息|+----+------+----------+------+--------+-----+------------+------------------+|3|根|本地主机|空|问查询|0|开始|显示进程列表||24|根|本地主机|测试|睡觉|6||空||25|根|本地主机|测试|睡觉|6||空||睡觉|6||空|+----+-----+------------+-----+--------+------+------------+----------------+4rowsinset(0.00sec)可以看到一个脚本执行生成三个数据库连接,但是如果后面实例化的pdo实例被赋值给前面实例化的pdo实例,新的连接会替换掉之前的连接,而不会产生新的连接。所以我们在编程过程中,应该避免pdo的多次实例化,造成不必要的数据库性能消耗。解决方案封装了一个单例模式的类,实例化这个类的过程就是创建pdo连接的过程。当我们要建立数据库连接时,我们不是手动实例化pdo,而是获取这个类的一个实例。在实例化pdo类时,设置持久连接参数:true));?>引用官方PHP文档:许多Web应用程序受益于使用与数据库服务的持久连接。持久连接在脚本结束后不会关闭,并且会被缓存起来,以便在发出另一个使用相同凭据的脚本连接请求时重新使用。持久连接缓存可以避免每次脚本需要与数据库对话时建立新连接的开销,从而使Web应用程序更快。脚本的正式结束是指以fpm方式结束一次客户端请求。然后,使用相同凭据的另一个脚本可以对应于使用相同数据库连接凭据的另一个客户端请求。首先我们要知道这两个客户端请求是根据fpm-workers的空闲状态分配给一个worker执行的,所以这两个请求分配给同一个worker的可能性很低。接下来,我们说明以下场景。开启长连接后,数据库连接缓存在fpm进程中。如果某个fpm-worker进程中已经缓存了一个长连接,此时可能会出现以下两种情况:当在脚本中再次执行带有ATTR_PERSISTENT参数的pdo连接时,会复用之前的连接而不会产生新的连接联系。当脚本中再次执行不带ATTR_PERSISTENT参数的pdo连接时,会再次生成新的数据库连接。