更新时间:2022-02-27 23:09:20
先说说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中文网