thinkphp5 mysql长连接_thinkphp5.1长连接-单例模式测试!

本文通过测试分析了ThinkPHP5中使用数据库长连接和单例模式对数据库操作的影响。在不采用持久连接的情况下,当达到最大连接数时会出现错误。而启用持久连接后,成功插入1000条记录,但日志显示每次插入仍有连接建立。进一步使用单例模式,避免了过多连接,提高了执行效率。测试结果显示,持久连接结合单例模式在执行效率上优于其他方式。
摘要由CSDN通过智能技术生成

在控制器中  使用以下代码测试

for ($i = 0; $i < 1000; $i++) {

$tmp['name'] = 'f_'.$i;

$tmp['times'] = date('Y-m-d H:i:s');

//第一测试 不采用 持久连接 mysql max_connection = 500  本次数据插入

//500 条之后 提示 too many connecntios 错误

//第二次测试 TP 采集持久连接

db('task')->insert($tmp);

}

数据库配置文件中 database.php

// 数据库连接参数

'params' => [

\PDO::ATTR_PERSISTENT   => true,

\PDO::ATTR_CASE         => \PDO::CASE_LOWER,

],

// 是否需要断线重连

'break_reconnect' => true,

采用持久连接参数之后,确实没有报错,数据库中顺利插入了 1000条记录

但是查看日志文件,

[ 2019-10-25T09:53:48+08:00 ][ sql ] [ DB ] CONNECT:[ UseTime:0.000315s ] mysql:host=127.0.0.1;dbname=xun_php_cn;charset=utf8

[ 2019-10-25T09:53:48+08:00 ][ sql ] [ SQL ] INSERT INTO `op_task` (`name` , `times`) VALUES ('f_697' , '2019-10-25 09:53:48') [ RunTime:0.000604s ]

[ 2019-10-25T09:53:48+08:00 ][ sql ] [ DB ] CONNECT:[ UseTime:0.000292s ] mysql:host=127.0.0.1;dbname=xun_php_cn;charset=utf8

[ 2019-10-25T09:53:48+08:00 ][ sql ] [ SQL ] INSERT INTO `op_task` (`name` , `times`) VALUES ('f_698' , '2019-10-25 09:53:48') [ RunTime:0.000643s ]

发现还是每插入一条数据,就有一条CONNECT记录 , 不理解了。

下一步用单例模式   新建了一个模型类

namespace app\index\model;

use think\Model;

use think\Db;

/**

* 使用静态方法 static 而不是 public 在controller里面不用new 直接用 会方便很多

*/

class TaskModel extends Model

{

private static $instance;

protected $defaultField = 'danli';

private function __clone() {}

//禁止被克隆

/**

* 单例

*/

public static function getInstance() {

if (!(self::$instance instanceof self)) {

self::$instance = new static();

}

return self::$instance;

}

/**

* 添加一条数据

*/

public static function insertOne($uname,$times) {

$inserttheone = self::getInstance()->execute("insert into op_task(name,times) value('".$uname."','".$times."')");

if ($inserttheone) {

return true;

} else {

return false;

}

}

/**

* 删除一条数据

*/

public static function deleteOne($uid) {

$delone = self::getInstance()->execute("delete from op_task where id = ".$uid."");

if ($delone) {

return true;

} else {

return false;

}

}

}

for ($i = 0; $i < 1000; $i++) {

$tmp['name'] = 'f_'.$i;

$tmp['times'] = date('Y-m-d H:i:s');

$delOne = TaskModel::insertOne($tmp['name'],$tmp['times']);

}

采用单例模式测试,数据库顺利插入1000条记录,没有报too many connections 错误

[ 2019-10-25T10:02:30+08:00 ][ sql ] [ SQL ] insert into op_task(name,times) value('f_718','2019-10-25 10:02:30') [ RunTime:0.002179s ]

[ 2019-10-25T10:02:30+08:00 ][ sql ] [ SQL ] insert into op_task(name,times) value('f_719','2019-10-25 10:02:30') [ RunTime:0.000588s ]

日志文件,也没有看到 多次的 connect记录。。

从测试结果来看,单例模式,数据库没有多次连接。

当然这只是对于一个页面中的操作,单例模式有效果,这涉及到PHP的执行模式了,对于高并发还是需要长连接。

for ($i = 0; $i < 1000; $i++) {

$tmp['name'] = 'f_'.$i;

$tmp['times'] = date('Y-m-d H:i:s');

//第一测试 不采用 持久连接 mysql max_connection = 500  本次数据插入

//500 条之后 提示 too many connecntios 错误

//第二次测试 TP 采集持久连接

db('task')->insert($tmp);

//$delOne = TaskModel::insertOne($tmp['name'],$tmp['times']);

//usleep(1000000);

}

记录了插入 700条数据的时间

正常连接-2.964616s

持久连接-1.928009s

正常连接-单例模式-1.767899s

持久连接-单例模式-1.652180s

从测试结果来看,,,采用持久连接  单例模式  执行效率确实提高不少。。。这次的测试时在 swoole的 task中进行的。

等下在通过nginx TP5直接测试一次,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值