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

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直接测试一次,

thinkphp5.1长连接-单例模式测试!的更多相关文章

  1. [NewLife.Net]单机400万长连接压力测试

    目标 对网络库NewLife.Net进行单机百万级长连接测试,并持续收发数据,检测网络库稳定性. [2020年8月1日晚上22点] 先上源码:https://github.com/NewLifeX/N ...

  2. OpenResty 高阶实战之————Redis授权登录使用短连接(5000)和长连接(500W) 使用连接池AB压力测试结果

    一.短连接开始测试 ab -n 5000 -c 100 -k 127.0.0.1/test_redis_short #demo1 Concurrency Level: Time taken for t ...

  3. HTTP的长连接和短连接——Node上的测试

        本文主要从实践角度介绍长.短连接在TCP层面的表现,借助Node.JS搭建后台服务,使用WinHTTP.Ajax做客户端请求测试,最后简单涉及WebSocket.     关键字:长连接.短连 ...

  4. HTTP长连接、短连接使用及测试

    概念 HTTP短连接(非持久连接)是指,客户端和服务端进行一次HTTP请求/响应之后,就关闭连接.所以,下一次的HTTP请求/响应操作就需要重新建立连接. HTTP长连接(持久连接)是指,客户端和服务 ...

  5. centos LB负载均衡集群 三种模式区别 LVS/NAT 配置 LVS/DR 配置 LVS/DR + keepalived配置 nginx ip_hash 实现长连接 LVS是四层LB 注意down掉网卡的方法 nginx效率没有LVS高 ipvsadm命令集 测试LVS方法 第三十三节课

    centos   LB负载均衡集群 三种模式区别 LVS/NAT 配置  LVS/DR 配置  LVS/DR + keepalived配置  nginx ip_hash 实现长连接  LVS是四层LB ...

  6. 异数OS TCP协议栈测试(三)--长连接篇

    异数OS TCP协议栈测试(三)--长连接篇 本文来自异数OS社区 github:   异数OS-织梦师(消息中间件)群: 476260389 异数OS TCP长连接技术简介 说起长连接,则首先要谈对 ...

  7. telnet 测试网站是否开启长连接

    测试服务器是否开启keepalive(长连接) telnet 主机名(域名|IP) 80 #发起请求GET /index.html HTTP/1.1Host: www.cbnsc.com 如果请求完后 ...

  8. HTTP的长连接和短连接

        本文总结&分享网络编程中涉及的长连接.短连接概念.     关键字:Keep-Alive,并发连接数限制,TCP,HTTP 一.什么是长连接 HTTP1.1规定了默认保持长连接(HTT ...

  9. C#中HttpClient使用注意:预热与长连接

    最近在测试一个第三方API,准备集成在我们的网站应用中.API的调用使用的是.NET中的HttpClient,由于这个API会在关键业务中用到,对调用API的整体响应速度有严格要求,所以对HttpCl ...

随机推荐

  1. Tomcat部署项目的三个方法

    所需软件安装 要想在Tomcat中部署项目前提是先要搭建好Tomcat,搭建Tomcat就离不开以下软件包的安装配置,本次演示使用Linux平台 1.JDK软件包 JDK是一切java应用程序的基础, ...

  2. UVA - 11400 Lighting System Design

    题文: You are given the task to design a lighting system for a huge conference hall. After doing a lot ...

  3. 常见Failed to load ApplicationContext异常解决方案!!

    java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.conte ...

  4. Orecle基本概述(2)

    1.视图1.1 视图介绍*一种虚拟的表,不是真实存在的表,以多种方式展示数据给用户看,1.2 视图使用*创建视图语法一(非只读): create or replace view 视图名字 as sql ...

  5. 禅道部署(基于Linux)

    部署步骤: 1. 查看Linux服务器是32位还是64位的 #getconf LONG_BIT 2. 禅道开源版安装包下载 下载站点1:#wget    http://sourceforge.net/ ...

  6. Fiddler的安装

    相关下载软件(链接:https://pan.baidu.com/s/1HFdFNph6FGHOFtZq09ldpg 提取码:3u3l ) fiddler是基于.net环境的,所以需要先安装.net 安 ...

  7. mysql 延时注入新思路

    转自先知社区https://xz.aliyun.com/t/2288 在4月的pwnhub比赛中,我们遇到了一个比较神奇的问题,如果在注入中遇到需要延时注入的情况,但服务端过滤了我们一般使用的slee ...

  8. ThinkPHP5 远程命令执行漏洞分析

    本文首发自安全脉搏,转载请注明出处. 前言 ThinkPHP官方最近修复了一个严重的远程代码执行漏洞.这个主要漏洞原因是由于框架对控制器名没有进行足够的校验导致在没有开启强制路由的情况下可以构造恶意语 ...

  9. Cocos2d-x入门之旅[4]场景

    我们之前讲了场景图(Scene Graph) 的概念,继续之前你先要知道 场景图决定了场景内节点对象的渲染顺序 渲染时 z-order 值大的节点对象会后绘制,值小的节点对象先绘制 HelloWorl ...

  10. Codeforces--Books Exchange (hard version)

    题目链接http://codeforces.com/contest/1249/problem/B2 .并查集思想,将数分成多个集合,每个集合的大小就是一轮的所需天数. Map[i]存储数据. flag ...