thinkphp5.1长连接-单例模式测试!
在控制器中 使用以下代码测试
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记录 , 不理解了。
下一步用单例模式 新建了一个模型类
<?php
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直接测试一次,