2022年02月27日整理发布:PHP中的数据库如何实现连接持久化
先说说PHP中的数据库是如何实现连接持久化的。相信朋友们也要密切关注这个话题。现在来说说PHP中的数据库如何为好友实现连接持久化。边肖还收集了PHP中的数据库如何实现连接持久性的相关信息。希望你看到的时候会喜欢。
本文介绍了PHP中数据库连接持久化的方法。有一定的参考价值,有需要的朋友可以参考一下,希望能帮到大家。
数据库优化是我们做web开发最重要的事情。甚至在很多情况下,我们实际上是在为数据库编程。当然,用户的所有操作和行为都是以数据的形式保存的。其中,数据库的连接创建过程中有什么可以优化的地方吗?当然,答案是肯定的。Java等语言有连接池,PHP在普通开发中没有连接池这种东西。在涉及多线程的时候,经常会用到连接池技术,所以PHP每次运行都会创建新的连接。那么这种情况下如何优化数据连接呢?
什么是数据库连接持久性?让我们首先来看看数据库连接持久性的定义。
持久数据库连接是在脚本完成运行时不会关闭的连接。当接收到持续连接的请求时。PHP将检查是否已经有一个相同的持久连接(以前打开过)。如果存在,将直接使用该连接;如果没有,请建立新的连接。所谓“相同”连接是指使用相同的用户名和密码连接到同一台主机。
不完全理解web服务器的工作和分布式负载的读者可能会误解持久连接的作用。特别是,持久连接不提供在同一连接上建立“用户会话”的能力,也不提供有效建立事务的能力。事实上,严格来说,持久连接不会提供任何非持久连接无法提供的特殊功能。
这是PHP中的连接持久化,但也指出了持久化连接不会提供任何非持久化连接无法提供的特殊功能。这就很混乱了。你不是说这个方案可以提升性能吗?
连接持久化有什么用?是的,从上面定义中指出的特殊功能来看,持久连接并没有带来新的或者更高级的功能,但是它最大的用处是提高效率,也就是性能会带来提升。
当在Web服务器和SQL服务器之间创建连接的开销很高时(例如花费很长时间和消耗更多的临时内存),持久连接会更有效。
也就是说,当连接成本高的时候,建立数据库连接的成本会更高,当然时间也会更长。使用持久连接后,每个子流程在其生命周期中只能连接一次,而不是每次处理一个页面就向SQL server发出连接请求。也就是说,每个子进程都将建立自己独立的与服务器的持久连接。
例如,如果有20个不同的子进程运行一个脚本来建立到SQL server的持久连接,那么实际上有20个不同的到SQL server的持久连接,每个进程一个。
效率对比就不多说了,直接通过代码对比。首先,我们定义一个统计函数来返回当前的毫秒时间。此外,我们还要准备数据连接参数。
函数getmicrotime()
{
list($usec,$sec)=explode(' ',microtime());
return((float)$ usec(float)$ sec);
}
$db=[
服务器'='localhost:3306 ',
用户'='root ',
密码'=',
database'='blog_test ',
];接下来我们用普通mysqli测试一下。
$ start time=getmicrotime();
for($ I=0;1000美元;$i ) {
$mysqli=new mysqli($db['服务器'],$db['用户'],$db['密码'],$db['数据库']);//持久连接
$ mysqli-close();
}
echo bcsub(getmicrotime(),$startTime,10),PHP _ EOL
//6.5814000000在创建数据库连接的1000个周期中,我们用了6秒多。接下来,我们使用持久连接来创建这1000个数据库连接。只需在mysqli的$host参数前加一个p:即可。
$ start time=getmicrotime();
for($ I=0;1000美元;$i ) {
$mysqli=新mysqli('p: '。$db['服务器'],$db['用户'],$db['密码
ord"], $db["database"]); //持久连接 $mysqli->close(); } echo bcsub(getmicrotime(), $startTime, 10), PHP_EOL; // 0.0965000000从 mysqli 的连接上来看,效率提升非常明显。当然,PDO 方式的数据库连接也提供了建立持久连接的属性。
$startTime = getmicrotime(); for ($i = 0; $i < 1000; $i++) { $pdo = new PDO("mysql:dbname={$db['database']};host={$db['server']}", $db['user'], $db['password']); } echo bcsub(getmicrotime(), $startTime, 10), PHP_EOL; // 6.6171000000 $startTime = getmicrotime(); for ($i = 0; $i < 1000; $i++) { $pdo = new PDO("mysql:dbname={$db['database']};host={$db['server']}", $db['user'], $db['password'], [PDO::ATTR_PERSISTENT => true]); //持久连接 } echo bcsub(getmicrotime(), $startTime, 10), PHP_EOL; // 0.0398000000PDO 方式连接时,需要给一个 PDO::ATTR_PERSISTENT 参数并设置为 true 。这样就让 PDO 建立的连接也成为了持久化的连接。
注意既然数据库的持久化连接这么强大,为什么不默认就是这种持久化的连接形式,而需要我们手动增加参数来实现呢?PHP 的开发者们当然还是有顾虑的。
如果持久连接的子进程数目超过了设定的数据库连接数限制,系统将会产生一些问题。如果数据库的同时连接数限制为 16,而在繁忙会话的情况下,有 17 个线程试图连接,那么有一个线程将无法连接。如果这个时候,在脚本中出现了使得连接无法关闭的错误(例如无限循环),则该数据库的 16 个连接将迅速地受到影响。
同时,表锁和事务也有需要注意的地方。
在持久连接中使用数据表锁时,如果脚本不管什么原因无法释放该数据表锁,其随后使用相同连接的脚本将会被持久的阻塞,使得需要重新启动 httpd 服务或者数据库服务
在使用事务处理时,如果脚本在事务阻塞产生前结束,则该阻塞也会影响到使用相同连接的下一个脚本
所以,在使用表锁及事务的情况下,最好还是不要使用持久化的数据库连接。不过好在持久连接和普通连接是可以在任何时候互换的,我们定义两种连接形式,在不同的情况下使用不同的连接即可解决类似的问题。
推荐:《2021年PHP面试题大汇总(收藏)》《php视频教程》
以上就是PHP中的数据库如何实现连接持久化的详细内容,更多请关注php中文网其它相关文章!
来源:php中文网
免责声明:本文由用户上传,与本网站立场无关。财经信息仅供读者参考,并不构成投资建议。投资者据此操作,风险自担。 如有侵权请联系删除!
-
万象汽车试驾,轻松搞定试驾。只需几步,即可开启您的驾驶体验之旅。首先,通过官网或APP预约试驾时间,选择心...浏览全文>>
-
北汽瑞翔试驾流程主要包括以下几个步骤:首先,客户到达4S店后,由销售顾问接待并了解客户需求。随后,销售顾...浏览全文>>
-
试驾MG4 EV全攻略:MG4 EV是一款主打年轻、智能与续航的纯电车型。外观时尚,车身紧凑,适合城市通勤。内饰...浏览全文>>
-
预约试驾奥迪SQ5 Sportback,可线上与线下结合操作。首先,访问奥迪官网或官方APP,选择“试驾预约”,填写个...浏览全文>>
-
红旗试驾预约通常需要以下条件:1 年龄要求:申请人需年满18周岁,部分门店可能要求20岁以上。2 驾驶证...浏览全文>>
-
特斯拉试驾全攻略试驾特斯拉前,建议提前在官网预约,选择最近的体验中心。到店后,工作人员会引导你完成基础...浏览全文>>
-
宝马预约试驾全攻略想要体验宝马的驾驶乐趣?提前预约试驾是关键。首先,访问宝马官网或使用“宝马中国”官方A...浏览全文>>
-
道郎格试驾,感受豪华与科技的完美融合。一进入车内,高端质感扑面而来,真皮座椅、精致内饰,尽显奢华。智能...浏览全文>>
-
预约奇瑞新能源试驾,新手可按以下步骤操作:1 选择车型:登录奇瑞官网或官方App,浏览新能源车型,如艾瑞...浏览全文>>
-
奔驰GLE试驾预约,开启非凡旅程。作为豪华SUV的典范,GLE集优雅设计与强大性能于一身,为您带来前所未有的驾驶...浏览全文>>
- 特斯拉试驾全攻略
- 宝马预约试驾全攻略
- 奔驰GLE试驾预约,畅享豪华驾乘,体验卓越性能
- 零跑C16试驾全攻略
- 试驾海豚,轻松几步,畅享豪华驾乘
- 奇瑞预约试驾的流程及注意事项
- 小鹏G7试驾,新手必知的详细步骤
- 如何在 IPHONE 16E 和 IPHONE 16 之间进行选择
- 这个隐藏的 ANDROID 设置可以释放大屏幕的全部潜力
- 三星 ONE UI 7 更新:比预期更早到来
- IPHONE 15 PRO 和 PRO MAX 将很快获得视觉智能
- 使用这些必备的 ANDROID 应用程序改变你的主屏幕
- PS5 PRO 销量与 PS4 PRO 竞争
- 超薄 Galaxy S25 Edge揭晓其新功能
- Android 15 QPR2 Beta 2.1 将修复与崩溃相关的问题
- Garmin 的 Fenix 7 Pro Sapphire Solar 降至 591 美元
- Galaxy S25 Ultra 的 S Pen 可能会失去蓝牙功能
- 惠普在 CES 上推出搭载 Copilot+ 的全新一体机和迷你电脑
- 首批 Galaxy S25 系列壁纸来了 但只有两张
- 1,000 马力的 911 Turbo S GT-R 与杜卡迪一较高下