php mysql长连接聊天室_PHP之探索MySQL 长连接、连接池

PHP连接MysqL的方式,用的多的是MysqL扩展、MysqLi扩展、pdo_MysqL扩展,是官方提供的。PHP的运行机制是页面执行完会释放所有该PHP进程中的所有资源的,如果有多个并发访问本地的测试页面 http://127.0.0.1/1.php 根据PHP跟web服务器的不同,会开相应的线程或者进程去处理该请求,请求完了会释放结果的。也就是PHP无法从语言层面从页面到页面之间传递一些数据,但是MysqL_pconnect跟pdo中的ATTR,设置array(PDO::ATTR_PERSISTENT => true)如下是可以实现长连接的。

$conn = new PDO($dsn,DB_USER,DB_PASSWORD,array(PDO::ATTR_PERSISTENT => true)

);

长连接的作用我觉得是在高负载的情况下,通过复用长连接,减少了每个页面的建立数据库连接的时间,而这个建立MysqL connection的时间,在我的机器上

在数据库connnections < 10的情况下,MysqL pdo 建立connection time 为0.003ms,MysqLi建立connection time为0.14ms

在数据库connection接近满的时候,MysqL pdo建立connection time为0.13ms,MysqLi建立connection time为0.13ms

以上样本都是在大概估测时间,时间太小不好估计。其实建立连接的时间并不长,那这样为什么需要MysqL长连接、连接池这样的东西呢。那是在高负载下,比如server单机可以接受的MysqL并发在200左右,web server的单机并发在700左右,那么当大批量500并发连接压过来的时候,web server没到满负荷,MysqL提前到了满负荷,就会导致所有页面无法响应、或者已经建立好数据库连接的页面执行很慢。

PHP中的MysqL长连接由于PHP的运行方式有多种,因而长连接实现也有多种。需要web服务器支持才可以实现长连接,因为PHP是没有进程池跟连接池这种概念的,绝大多数情况下PHP应用本身不是一个应用服务器(后起之秀swoole,是一个优秀的PHP应用服务器,不过是在c层面做的)。因而PHP的长连接其实是搭载apache这样的带有mpm模块的webserver,linux 下apache会维护一个进程池,开启了apache mpm功能之后,apache会默认维持一个进程池,MysqL长连接之后的连接,并没有作为socet连接关闭,而是作为一个不释放的东西,放进了进程池/线程池里面去。等需要连接的时,apache从它维护的进程池/线程池里面取出MysqL socket connnection,然后就可以复用此连接了。

这里测试一下,首先本机环境是archlinux,后文所用MysqL httpd PHP都是自己编译的源代码,都在/home/dengpan/opt目录。httpd的mpm模型这里采用的是worker,httpd的mpm(apache用于并行方面功能的,俗称多路处理模块)其实有perfork、worker、event三种。mpm的好处是让apache随时有些备用的spare或者空闲的子进程(服务器线程池),随时等待新过来的请求,这样客户端不需要在请求服务之前等待子进程的产生。

使用什么mpm,需要单独指定编译进去apache里面去,比如编译work mpm到apache里面去,比如我的最简化httpd的编译参数是

./configure \

--with-apr=/home/dengpan/opt/apr-1.5.2 \

--with-apr-util=/home/dengpan/opt/apr-util-1.5.4 \

--prefix=/home/dengpan/opt/httpd-2.4.16 \

--with-mpm=worker

查看httpd加载的模块,

e3c6a18f691feac7c124b4f39ed5563f.png

看到worker.c 已经编译过去了,

mpm的配置参数为

StartServers 15

MinSpareThreads 75

MaxSpareThreads250

ThreadsPerChild 10

MaxRequestWorkers 400

MaxConnectionsPerChild 0

启动apache用pstree看到 |-httpd—15[httpd—11[{httpd}]],说明起了15个server进程,每个server起了10个子线程。整个mpm要维持的最小的闲置线程数量在75,最大的闲置线程在250。满载的最大的工作线程在400个。下面准备一个shell脚本,每1秒输出下当前MysqL的active连接数量,查看MysqL current连接数我用的较多的有2个方法

进MysqL shell,执行SHOW STATUS WHERE variable_name = ‘Threads_connected'; 不过这个方法得MysqL shell进的去才对,当connections很多的时候,MysqL shell进不去也就无法查询了

shell直接查询,find /proc/pidof MysqLd/fd/ -follow -type s | wc -l,需要root权限,好处是即使MysqL因为too many connections无法进入shell的时候还是可以连接进去。

这里用方法2,因为后面回到机器的MysqL满载负荷的。写一个shell如下:

#!/bin/bash

while(true)

do

find /proc/`pidof MysqLd`/fd/ -follow -type s | wc -l

sleep 1

done

后面执行该shell不断的输出当前连接数,测试可得

cli下执行PHP,长连接无效,cli下脚本一退出,连接即释放

apche+mod_PHP不开启mpm模块的话,无论MysqL MysqL_pconnect、pdo_MysqL长连接,页面访问完毕,MysqL连接即释放。

apche+mod_PHP开启mpm模块(worker模式)的话,无论MysqL MysqL_pconnect、pdo_MysqL长连接,MysqL连接+1,直到达到最大的MysqL连接数,不在增加,但是访问页面还是可以复用连接查询到相应数据。

apache之所以能够复用MysqL连接,说明apache肯定为MysqL自己实现了一些功能函数、模块,否则不可能把一个未知类型的socket指针存下来的。用ldd查看,

➜ MysqL_persist ldd /home/dengpan/opt/httpd-2.4.16/bin/httpd

linux-vdso.so.1 (0x00007ffffcbde000)

libpcre.so.1 => /usr/lib/libpcre.so.1 (0x00007f8e8d17c000)

libaprutil-1.so.0 => /home/dengpan/opt/apr-util-1.5.4/lib/libaprutil-1.so.0 (0x00007f8e8cf57000)

libexpat.so.1 => /usr/lib/libexpat.so.1 (0x00007f8e8cd2d000)

libapr-1.so.0 => /home/dengpan/opt/apr-1.5.2/lib/libapr-1.so.0 (0x00007f8e8cafb000)

libuuid.so.1 => /usr/lib/libuuid.so.1 (0x00007f8e8c8f6000)

librt.so.1 => /usr/lib/librt.so.1 (0x00007f8e8c6ee000)

libcrypt.so.1 => /usr/lib/libcrypt.so.1 (0x00007f8e8c4b6000)

libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f8e8c299000)

libdl.so.2 => /usr/lib/libdl.so.2 (0x00007f8e8c095000)

libc.so.6 => /usr/lib/libc.so.6 (0x00007f8e8bcf3000)

/lib64/ld-linux-x86-64.so.2 (0x00007f8e8d3ec000)

可以猜测出/home/dengpan/opt/apr-util-1.5.4/lib/libaprutil-1.so.0跟/home/dengpan/opt/apr-1.5.2/lib/libapr-1.so.0应实现了跟MysqL相关的代码段。由于我是本地编译的,很方便找到函数入口,/home/dengpan/github/apache-httpd/apr-util-1.5.4/dbd/apr_dbd_MysqL.c这个文件,其实是apache的mod_dbd对常见的数据库都做了长连接支持。而Nginx跟PHP-fpm的关系并不像PHP跟apache那样,所以Nginx+PHP-fpm无法实现对应的长连接。大概是PHP-fpm并没有做MysqL的进程、线程池。

最后给出我的建议,一般小型PHP应用是没有性能问题的,PHP自身连接MysqL很快,很多都处于性能过剩,随着apache慢慢被Nginx替代,PHP的MysqL长连接也只会越来越鸡肋。单机的话,其实要是怕MysqL创建connections有压力,最好把MysqL的创建使用单例模式,这样一个页面只会创建一个MysqL连接实例。诸如下面的单例例子代码,而这个更适合写在框架里去实现单例。

/**

* Created by PHPStorm.

* User: dengpan

* Date: 15-7-24

* Time: 下午2:56

*/

include "./db.PHP";

class DB {

private static $_instance;

private $db;

private function __construct()

{

$this->db = new MysqLi(DB_HOST,'my',3307);

}

public static function getInstance()

{

if (!(self::$_instance instanceof DB)) {

self::$_instance = new self();

}

return self::$_instance;

}

private function __clone()

{

}

public function getConn()

{

return $this->db;

}

}

$conn = DB::getInstance()->getConn();

点关注,不迷路

好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是人才。之前说过,PHP方面的技术点很多,也是因为太多了,实在是写不过来,写过来了大家也不会看的太多,所以我这里把它整理成了PDF和文档,如果有需要的可以

f9b64ae5502d25c92381f6c90ffc0648.png

07a63a31ebb230dda4fd1458ef8fb05f.png

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、MysqL优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要的可以加入我的

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

如您喜欢交流学习经验,点击链接加入交流1群:1065694478(已满)交流2群:163560250

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/530003.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 读取地震道头数据_python地震数据可视化详解

本文实例为大家分享了python地震数据可视化的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下准备工作&#xff1a;在windows10下安装python3.7&#xff0c;下载参考源码到本地。1. demo绘图测试demo绘图指令cmd> python seisplot.py --demo问题1)缺少依赖包File &…

java程序员 css_Java程序员从笨鸟到菜鸟之(十七)CSS基础积累总结(下)

七.组织元素(span和div)span和div元素用于组织和结构化文档&#xff0c;并经常联合class和id属性一起使用。在这一课中&#xff0c;我们将进一步探究span和div的用法&#xff0c;因为这两个HTML元素对于CSS是很重要的。用span组织元素用div组织元素用span组织元素span元素可以说…

java set泛型_Java 集合二 泛型、Set相关

泛型1、在定义一个类的方法时&#xff0c;因为不确定返回值类型&#xff0c;所以用一个符号代替&#xff0c;这个符号就是泛型eg:ArrayList list new ArrayList();2、泛型的好处&#xff1a;1、提高了数据的安全性&#xff0c;将运行时的问题提前暴露在编译阶段2、避免了强转的…

java gson_Java 中 Gson的使用

JSON 是一种文本形式的数据交换格式&#xff0c;它比XML更轻量、比二进制容易阅读和编写&#xff0c;调式也更加方便;解析和生成的方式很多&#xff0c;Java中最常用的类库有&#xff1a;JSON-Java、Gson、Jackson、FastJson等一、Gson的基本用法Gson提供了fromJson() 和toJson…

java web 集成dom4j_[JavaWeb基础] 031.dom4j写入xml的方法

上一篇我们讲述了dom4j读取xml的4种方法&#xff0c;甚是精彩&#xff0c;那么怎么样写入xml呢&#xff1f;我们直接看下源码实现。public static void main(String[] args) throws Exception {// 创建文档Document document DocumentHelper.createDocument();// 设置编码docu…

java servlet 调试日志 logger sae_java servlet 调试日志 lo

java servlet 调试日志 lo[2021-02-10 08:32:08] 简介:php去除nbsp的方法&#xff1a;首先创建一个PHP代码示例文件&#xff1b;然后通过“preg_replace("/(\s|\&nbsp\;| |\xc2\xa0)/", " ", strip_tags($val));”方法去除所有nbsp即可。推荐&#x…

求java简单计算器源代码_java简单计算器源代码

简单计算器代码package calcultorthree;import java.awt.BorderLayout;//导入边界布局管理器类import java.awt.GridLayout;//导入网格布局管理器类import java.awt.TextField;//导入文本区域类import java.awt.event.ActionEvent;//导入事件类import java.awt.event.ActionLis…

java遍历斐波纳契数列_详解循环、迭代、递归、分治(Leet Code 509 斐波那契数列),实际运用...

Multiple solutions of Fibonacci (Python or Java)本章是用英文写的&#xff0c;作为或想成为一名优秀的攻城狮&#xff0c;习惯阅读英文文档将使你受益良多。例如更好的查看最新版的官方文档、与国外友人交流、等等 其实英文的生词也并不多,其中90&#xff05;的英文都在代码…

java 二分查找 排序_java 冒泡排序 二分查找

下面这个程序是先定义一个整型数组&#xff0c;然后将其中的元素反序赋值&#xff0c;再用冒泡排序进行排序以后用二分查找来查找其中是否有某个数&#xff0c;返回值为-1时表示这个数可能小于这个数组的最小值或大小这个数组的最大值&#xff0c;-2表示这个数比这个数组的最小…

php里h和h的区别吗,编码h264h和h264b有什么区别

区别如下&#xff1a;1、版本H.265是新的编码协议&#xff0c;也即是H.264的升级版。H.265标准保留H.264原来的某些技术&#xff0c;同时对一些相关的技术加以改进。新技术使用先进的技术用以改善码流、编码质量、延时和算法复杂度之间的关系&#xff0c;达到最优化设置。2、储…

php 抽象类 静态方法吗,php中的抽象类和静态方法是什么

php中的抽象类是指&#xff1a;在class前加了abstract关键字且存在抽象方法的类&#xff0c;它不能被直接实例化&#xff1b;静态方法是指&#xff1a;被static关键字修饰的方法&#xff0c;静态方法用于操作静态属性。抽象类抽象类是指在 class 前加了 abstract 关键字且存在抽…

centos 怎样下载php,centos下怎样安装软件

centos下安装软件的方法是&#xff1a;centos安装软件的命令1、rpm包的安装1.安装一个包# rpm -ivh2.升级一个包# rpm -Uvh3.移走一个包# rpm -e4.安装参数--force 即使覆盖属于其它包的文件也强迫安装--nodeps 如果该RPM包的安装依赖其它包&#xff0c;即使其它包没装&#xf…

php post 微信沙箱,微信支付平台错误:获取沙箱密钥失败,确保交易密钥是

按官方提示进行获取沙箱密钥的时候&#xff0c;久试不爽&#xff0c;总是提示错误 &#xff1a;“获取沙箱密钥失败&#xff0c;确保交易密钥是否正确”。这个纯粹是微信平台挖的坑呀&#xff0c;文档没有详细的进行一些讲解&#xff0c;也没有提示需要key&#xff0c;下面来说…

linux显示磁盘使用情况命令,Linux中监控磁盘分区和使用情况的几个工具

导读在文章中将讨论Linux中可用于监视磁盘使用情况的命令行实用程序&#xff0c;提供有关总大小容量、已用总量、文件系统信息和分区信息等。让我们看看这些工具如何帮助检索这些信息df命令df是一个Linux命令行实用程序&#xff0c;用于监视Linux磁盘使用情况。df命令显示文件系…

linux网络是文件吗,linux网络配置文件是什么意思

离开了么放得下我么回来了么还会爱我么新兵答主07-22TA获得超过2383个赞网卡的配置&#xff1a;1.网卡配置文件对于网卡信息的配置通常包括&#xff1a;配置IP地址、子网掩码和网关。网卡信息保存在网卡配置文件中。网卡配置文件位于/etc/sysconfig/network-scripts目录下。一块…

cd linux给u盘安装程序,使用U盘安装CDlinux

3、先把u盘插在电脑上与电脑连接&#xff0c;格式化成“FAT”文件系统&#xff0c;更改卷标为“CDLINUX”&#xff0c;之后再打开UltraISO工具进行写入&#xff1a;a、这里把你下载好的CDlinux文件打开。b、点击“写入硬盘映像”c、这里直接默认就好&#xff0c;点击“写入”4、…

zenmap扫描出来linux,如何在Linux上使用NMAP安全扫描器

Nmap是一个免费的开源网络发现和安全审计实用程序&#xff0c;在Linux用户社区中被广泛使用&#xff0c;因为它使用起来非常强大。 Nmap通过在特定目标(通过IP)发送数据包&#xff0c;并通过解释传入的数据包来确定哪些帖子被打开/关闭&#xff0c;扫描系统上运行什么服务&…

c语言小明今年16岁,C语言1.爷爷对小明说:我现在的年龄是你的7倍,过几年是你的6倍,再过若干年就分别是你的5倍,4倍,3倍,2倍.你知道爷爷和小明现在的年龄吗?...

满意答案ta_meng2013.06.15采纳率&#xff1a;49% 等级&#xff1a;12已帮助&#xff1a;5126人#include void main(){int i,j,k;int t60,t50,t40,t30,t20; //用于标记是否达到过这些要求&#xff0c;C语言貌似没有bool类型吧for (i21;i<200;i7) //爷爷的年龄为i{ji/7;…

Android usb 权限广播,android10.0 USB弹窗权限流程解析

USB请求权限流程1. 新建activity&#xff0c;获取UsbManager usbManager (UsbManager) getSystemService(Context.USB_SERVICE)2. 获取所以的USB设备HashMap map usbManager.getDeviceList()3. 过滤别的USB设备&#xff0c;拿到自己USB的USBDevice类&#xff0c;然后请求USB权…

android 仿网易标题栏,仿网易新闻可滑动标题栏TabLayout(文字或图标)

近期有需要&#xff0c;要做一个类似于网易新闻首页中的可滑动标题栏 TabLayout&#xff0c;根据大神写的 FlycoTabLayout 改造了一下&#xff0c;可以加载网络图片&#xff0c;主要实现内容如下&#xff1a;1. 可配置标题选中效果(下划线/上三角/圆角矩形或椭圆)&#xff1b;2…