PDO长连接_afterlife_union的博客-CSDN博客_pdo 长连接


本站和网页 https://blog.csdn.net/afterlife_union/article/details/116027825 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

PDO长连接_afterlife_union的博客-CSDN博客_pdo 长连接
PDO长连接
afterlife_union
于 2021-04-22 19:56:55 发布
311
收藏
分类专栏:
PHP
文章标签:
mysql
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/afterlife_union/article/details/116027825
版权
PHP
专栏收录该内容
18 篇文章
0 订阅
订阅专栏
pdo长连接
1、PDO长连接的概念2、长连接的实现原理3、长连接代码示例4、长连接测试5、长连接复用条件6、tcp长连接keepalive机制7、http长连接8、应用层心跳9、源码看长连接参考
1、PDO长连接的概念
PDO长连接是指和数据库建立连接后,本次请求结束后,连接不释放,等待下次请求继续复用的技术。
需要指明的是,长连接依托于常驻进程,命令行模式下,脚本执行完退出后连接必然会被释放,php的长连接最常见的是php-fpm执行模式下,fastcgi执行完一个请求后,后面的请求可以继续复用前一次请求创建的连接,从而省去了建立连接的开销,提升了性能。
2、长连接的实现原理
在php-fpm模式下,长连接本质上是在请求结束时,不释放数据库连接,一直等到MShutdow阶段才释放连接资源,也就每个php-fpm工作进程会占用一个长连接,当然实际中因为一个php-fpm会处理的接口可能涉及不同的数据库,因此一个php-fpm工作进程是可能含有多个数据库长连接的。而整个应用和一个数据库的长连接个数通常不会超过php-fpm工作进程的总数。
3、长连接代码示例
$config = [
'db_host' => '192.168.0.12',
'db_name' => 'test_db',
'db_prefix' => 't_',
'db_user' => 'test_user',
'db_pass' => 'test_pass',
'db_port' => '3306'
];
$dsn = "mysql:dbname={$config['db_name']};host={$config['db_host']}";
$options = array(
\PDO::ATTR_PERSISTENT => true
);
$pdo = new PDO($dsn, $config['db_user'], $config['db_pass'], $options);
$sql = "select * from t_example order by id desc limit 1";
$stmt = $pdo->query($sql);
在创建 PDO对象时, 传递 PDO::ATTR_PERSISTENT 值为 true的 $options参数,创建的就是长连接。
4、长连接测试
为了方便学习和测试,可以将php-fpm的工作进程数设置为1,可参考如下配置
pm = dynamic
pm.max_children = 1
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 1
pm.process_idle_timeout = 30s;
5、长连接复用条件
如果当前所需连接的host、port、数据库名、用户名这些参数,在当前的空闲连接中,存在某个连接,连接参数完全匹配,那么就会复用空闲连接,否则就会重新创建一个连接。
6、tcp长连接keepalive机制
TCP是面向连接的,一般情况,两端的应用程序可以通过发送和接收数据得知对端的存活。 当两端的应用程序都没有数据发送和接收时,如何判断连接是否正常呢?
用SO_KEEPALIVE来开启或者关闭保活探测,默认情况下是关闭的。
当SO_KEEPALIVE开启时,可以保持连接检测对方主机是否崩溃,避免(服务器)永远阻塞于TCP连接的输入,可以通过以下相关的参数进行控制: tcp_keepalive_time 整型,单位秒,缺省值: 7200,Linux >=2.2可用 tcp_keepalive_probes 整型,做大探活次数 tcp_keepalive_intvl :整型,单位秒,探活包间隔,默认值: 75, Linux >= 2.4 可用
这些属性可以在/proc/sys/net/ipv4/下查看:
ll /proc/sys/net/ipv4/tcp_keepalive*
cat /proc/sys/net/ipv4/tcp_keepalive*
75
1800
也可以通过命令行查看:
sudo sysctl -a | grep keepalive
net.ipv4.tcp_keepalive_time = 7200
net.ipv4.tcp_keepalive_probes = 9
net.ipv4.tcp_keepalive_intvl = 75
探活的过程如下: 开启SO_KEEPALIVE后,如果tcp_keepalive_time时间内,套接口的任一方向都没有数据发送,TCP就自动给对方发一个保持存活探测包。这是一个对方必须响应的TCP包.
如果对方正常接收,并以期望的ACK响应,则认为连接正常,之后每隔tcp_keepalive_time时间后,发出新的探测包。 如果对方已崩溃且已重新启动,则对方返回RST报文,则关闭套接口。 如果对方无任何响应:则接下来每隔tcp_keepalive_intvl时间,发送一个新的探活报文,直至收到响应,最多尝试tcp_keepalive_probes 次,达到最大尝试次数后,则套接口的待处理错误被置为ETIMEOUT,套接口本身则被关闭。如ICMP错误是“host unreachable(主机不可达)”,说明对方主机并没有崩溃,但是不可达,这种情况下待处理错误被置为 EHOSTUNREACH。
SO_KEEPALIVE默认的间隔时间为2小时,有些偏长,不利于应用程序检测连接状态,可以通过两种方式调整相关参数。 第一种,修改 /etc/sysctl.conf 的全局配置:
net.ipv4.tcp_keepalive_time=1800
net.ipv4.tcp_keepalive_intvl=75
net.ipv4.tcp_keepalive_probes=9
添加上面的配置后输入 sysctl -p 使其生效, 可以使用命令来查看当前的默认配置
sysctl -a | grep keepalive
如果应用中已经设置SO_KEEPALIVE,程序不用重启,内核直接生效.
这种方法设置的全局的参数,针对整个系统生效,对单个socket的设置不够友好。
第二种,针对单个连接设置,可以使用TCP的TCP_KEEPCNT、TCP_KEEPIDLE、TCP_KEEPINTVL3个选项,在建立连接的时候,针对每个socket 设置这些属性的值。
// 开启 keepalive 示例
keepAlive = 1;
Setsockopt(listenfd, SOL_SOCKET, SO_KEEPALIVE, (void*)&keepAlive, sizeof(keepAlive));
int keepIdle = 1000;
int keepInterval = 10;
int keepCount = 10;
# 调整keepalive参数示例
Setsockopt(listenfd, SOL_TCP, TCP_KEEPIDLE, (void *)&keepIdle, sizeof(keepIdle));
Setsockopt(listenfd, SOL_TCP,TCP_KEEPINTVL, (void *)&keepInterval, sizeof(keepInterval));
Setsockopt(listenfd,SOL_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount));
7、http长连接
https://en.wikipedia.org/wiki/HTTP_persistent_connection
8、应用层心跳
一些系统除了使用tcp的心跳机制,还会在应用层设计心跳,原因包括两个:
TCP keepalive处于传输层,由操作系统负责,能够判断进程存在,网络通畅,但无法判断进程阻塞或死锁等问题。 客户端与服务器之间有四层代理或负载均衡,即在传输层之上的代理,只有传输层以上的数据才被转发,例如socks5等 所以,基于以上原因,有时候还是需要应用程序自己去设计心跳规则的。 可以服务端负责周期发送心跳包,检测客户端,也可以客户端负责发送心跳包,或者服服务端和客户端同时发送心跳包。
https://www.zhihu.com/question/40602902
9、源码看长连接
长连接相关代码在 php-src\ext\pdo\pdo_dbh.c 的方法 PHP_METHOD(PDO, dbh_constructor) 中
参考
1、Persistent Database Connections 2、apis-php-mysqlnd.persist 3、mysqli Connections 4、keep alive 机制 5、usingkeepalive
afterlife_union
关注
关注
点赞
收藏
打赏
评论
PDO长连接
pdo长连接长连接的概念长连接的实现原理长连接代码示例长连接学习测试长连接复用条件参考博客长连接的概念长连接是指和数据库建立连接后,本次请求结束后,连接不释放,等待下次请求继续复用的技术。首先需要指明的是,长连接依托于常驻进程,命令行模式下,脚本执行完毕后连接必然会被释放,php的长连接最常见的是php-fpm执行模式下,fastcgi执行完一个请求后,后面的请求可以继续复用前一次请求创建的连接,从而省去了建立连接的开销,提升了性能。长连接的实现原理在php-fpm模式下,长连接本质上是在请求结束
复制链接
扫一扫
专栏目录
php pdo是长连接还是短链接,php基础知识(pdo数据库的连接练习)--2018年9月4日11:20:28...
weixin_34163098的博客
03-10
139
实例//用数组创建连接数据库的内容$db=['sql'=>'mysql:host=127.0.0.1;dbname=php','user'=>'root','password'=>'root'];try{//创建一个pdo对象连接数据库,判断数据库是否连接成功$pdo=newPDO($db['sql'],$db['user'],$db['password']);//...
pdo mysql 连接池_关于 PHP MySQL 长连接、连接池的一些探索
weixin_29119475的博客
02-28
182
php连接mysql的方式,用的多的是mysql扩展、mysqli扩展、pdo_mysql扩展,是官方提供的。php的运行机制是页面执行完会释放所有该php进程中的所有资源的,如果有多个并发访问本地的测试页面 http://127.0.0.1/1.php 根据php跟web服务器的不同,会开相应的线程或者进程去处理该请求,请求完了会释放结果的。也就是php无法从语言层面从页面到页面之间传递一些数据...
参与评论
您还未登录,请先
登录
后发表或查看评论
php pdo mysql mysqli_PHP 的 pdo_MySQL 与 MySQLi,二者都用长连接,哪个更快?
weixin_42517607的博客
01-19
36
经测试:pdo_mysql持久连接的速度 快于 mysqli持久连接的速度 快于 mysql持久连接的速度结果:mysql持久连接:1-- 0.000801801681518552-- 0.000483989715576173-- 0.000454902648925784-- 0.000448942184448245-- 0.00050282478332526-- 0.00045204162597...
【小计】PDO关闭链接在脚本未结束前
C_Y_D的博客
01-19
69
不多BB 直接上图
官网内容:要想关闭连接,需要销毁对象以确保所有剩余到它的引用都被删除,可以赋一个 null 值给对象变量。
ok,上代码操作一哈
<?php
set_time_limit(0);//测试无需控制超时
$dbh = new PDO('mysql:host=127.0.0.1;dbport=3306;dbname=test', 'root', '111111');
// 在此使用连接
$stmt = $dbh->prepare('SELECT * FROM `user`');
php mysql PDO使用
热门推荐
我是谁的专栏
09-07
5万+
$dbh = new PDO('mysql:host=localhost;dbname=access_control', 'root', ''); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $dbh->exec('set names utf8'); /*添加*///$sql = "INSERT INTO `u
php封装pdo实例以及pdo长连接的优缺点总结
菜鸟教程
03-17
594
更多python教程请到友情连接: 菜鸟教程https://www.piaodoo.com 茂名一技http://www.enechn.comppt制作教程步骤 http://www.tpyjn.cn 兴化论坛http://www.yimoge.cn 电白论坛 http://www.fcdzs.com
一、前言
最近需要写脚本来实现崩溃日志的入库,不出所料又是脱离于框架的,那么行吧,咱们只能自己封装数据库相关操作了。博主这里选择了封装pdo操作数据库相关。
二、为什么选择pdo
众所周知的,php在早
php pdo 自动重连,PHP PDO 自动重连
weixin_28771421的博客
04-11
71
dbHost = $dbHost;$this->dbName = $dbName;$this->dbUser = $dbUser;$this->dbPass = $dbPass;while(!$this->connect()){sleep(1);echo "初始化数据库连接失败\n";};}public function connect(){try{$this->db...
pdo连接mysql数据库持久连接_使用PDO持久化连接
weixin_39550937的博客
01-19
105
无论是何种编程语言,几乎都要经常与各种数据库打交道。不过,众所周知的是,在程序与数据库之间建立连接是一件比较耗费资源的事情,因此编程技术领域的许多专家、前辈们就设想并提出了各种解决方案,以减少不必要的资源浪费,从而提高程序对数据库的访问能力。在程序与数据库的许多连接方案中,最广为人知、也是应用得最广泛的解决方案就是使用数据库连接池。不过,我们今天要介绍的主角并不是连接池,毕竟自行编写代码创建连接池...
php pdo长连接,在PDO中使用持久连接有哪些缺点
weixin_30019895的博客
03-10
214
小编典典请务必阅读以下答案,其中详细介绍了缓解此处概述的问题的方法。使用PDO与进行持久连接的任何其他PHP数据库接口一样,也存在相同的缺点:如果您的脚本在数据库操作过程中意外终止,则下一个获得剩余连接的请求将在死脚本停止的地方接管。连接在进程管理器级别(Apacheformod_php,如果使用的是FastCGI,则为当前的FastCGI进程,等等)保持打开状态,而不是在PHP级别保持打开状态,...
mysql的pdo连接_pdo连接mysql操作方法
weixin_30311179的博客
01-19
644
代码如下:$dbh = new PDO(‘mysql:host=localhost;dbname=access_control‘, ‘root‘, ‘‘);$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);$dbh->exec(‘set names utf8‘);/*添加*///$sql = "INSERT ...
PDO 长连接,及属性查看方法
编程资料大全
05-09
403
<?php
$pdo = new PDO('mysql:host=127.0.0.1;port=3306;dbname=mobile;','root','',array(
PDO::ATTR_PERSISTENT => true,
));
$attributes = array(
"AUTOCOMMIT", "ERRMODE", "CASE", "CLIENT...
php pdo长连接和端口,pdo长连接使用的误区
weixin_29442031的博客
03-18
214
最近使用自建的swoole框架时总是报一个错误:PHP Fatal error: Uncaught Swoole\Error: Socket#10 has already been bound to another coroutine#432, reading of the same socket in coroutine#434 at the same time is not allowed i...
pdo连接
最新发布
qq_40862242的博客
03-21
158
数据库pdo连接
【MySQL】pdo连接数据连接很慢
咔咔博客
07-24
863
上图是使用pdo连接mysql时计算的连接时间,为什么会差距这么大
最终的问题就是在这里,连接使用127.0.0.1速度嗖嗖的
总结
在使用PDO连接数据库主机地址使用IP而不是域名,使用域名会让PDO在连接之前进行一次不必要的dns lookup,当DNS缓存过于巨大的时候,这个问题可能会更严重。(即使是运行在本机,使用 127.0.0.1 而不是 localhost)
这是一份pdo的一...
关于 PHP MySQL 长连接、连接池的一些探索
will5451的博客
02-22
1万+
php连接mysql的方式,用的多的是mysql扩展、mysqli扩展、pdo_mysql扩展,是官方提供的。php的运行机制是页面执行完会释放所有该php进程中的所有资源的,如果有多个并发访问本地的测试页面 http://127.0.0.1/1.php 根据php跟web服务器的不同,会开相应的线程或者进程去处理该请求,请求完了会释放结果的。也就是php无法从语言层面从页面到页面之间传递一些数据
php封装pdo实例以及pdo长连接的优缺点
铁柱的博客
03-25
4001
文章目录一、前言二、为什么选择pdo三、pdo的长连接1、什么是pdo的长连接2、长连接对nginx无效吗3、php-fpm下的长连接测试4、长连接对事务的影响5、总结四、pdo部分demo的封装1、断线重连机制2、转化php warnings为try..catch可捕获的错误3、析构方法回收资源4、query的时候ping一下5、下载地址
一、前言
&nbsp...
PHP 使用PDO持久化连接
wangyufeng
09-06
1951
PHP 使用PDO持久化连接
支持自动重连接的PHP PDO类完善
NickyChou的博客
09-24
3963
支持自动重连接的PHP PDO类完善
PHP的PDO是取代原来的php-mysql、php-mysqli模块的统一数据库访问模块,
比直接使用各自数据库提供的原始扩展函数相比,PDO的好处是移植性更好些。
最近在使用PDO开发框架过程,对其有了更多些的认识。
*)对长连接的支持
*)异常的使用
*)连接的自动关闭控制
*)连接中断的重连接(MyS
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
©️2022 CSDN
皮肤主题:深蓝海洋
设计师:CSDN官方博客
返回首页
afterlife_union
CSDN认证博客专家
CSDN认证企业博客
码龄2年
暂无认证
52
原创
31万+
周排名
3万+
总排名
4万+
访问
等级
651
积分
61
粉丝
获赞
评论
21
收藏
私信
关注
热门文章
ssh-keygen命令使用
15063
nginx open() “/var/run/nginx.pid“ failed
4024
php开启 php-fpm状态页
2387
php file_put_contents不能写入问题
2075
macbook pro系统搭建laravel8 环境
1874
分类专栏
PHP
18篇
生活
1篇
2篇
中间件
4篇
人工智能
linux
1篇
架构
云原生
1篇
研发效能及质量
分布式
工具环境配置
11篇
网络协议
3篇
监控
docker
2篇
golang
mysql
2篇
java
2篇
安全
最新评论
压测工具使用
不吃西红柿丶:
很不错的文章,宝藏博主~
centos 7系统开发环境搭建
water___Wang:
windows php环境搭建
不正经的kimol君:
大佬,我准备跟你混了!
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
Laravel Macroable
php 闭包
buffer 和 cache 的含义
2022年17篇
2021年32篇
2020年3篇
目录
目录
分类专栏
PHP
18篇
生活
1篇
2篇
中间件
4篇
人工智能
linux
1篇
架构
云原生
1篇
研发效能及质量
分布式
工具环境配置
11篇
网络协议
3篇
监控
docker
2篇
golang
mysql
2篇
java
2篇
安全
目录
评论
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
打赏作者
afterlife_union
你的鼓励将是我创作的最大动力
¥2
¥4
¥6
¥10
¥20
输入1-500的整数
余额支付
(余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付
您的余额不足,请更换扫码支付或充值
打赏作者
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值