我的编程空间,编程开发者的网络收藏夹
学习永远不晚

详解PHP中的数据库连接持久化

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

详解PHP中的数据库连接持久化

PHP中的数据库连接持久化

数据库的优化是我们做web开发的重中之重,甚至很多情况下其实我们是在面向数据库编程。当然,用户的一切操作、行为都是以数据的形式保存下来的。在这其中,数据库的连接创建过程有没有什么可以优化的内容呢?答案当然是有的,Java等语言中有连接池的设定,而PHP在普通开发中并没有连接池这种东西,在牵涉到多线程的情况下往往才会使用连接池的技术,所以PHP每次运行都会创建新的连接,那么这种情况下,我们如何来优化数据连接呢?

什么是数据库连接持久化

我们先来看下数据库连接持久化的定义。

持久的数据库连接是指在脚本结束运行时不关闭的连接。当收到一个持久连接的请求时。PHP 将检查是否已经存在一个(前面已经开启的)相同的持久连接。如果存在,将直接使用这个连接;如果不存在,则建立一个新的连接。所谓“相同”的连接是指用相同的用户名和密码到相同主机的连接。

对 web 服务器的工作和分布负载没有完全理解的读者可能会错误地理解持久连接的作用。特别的,持久连接不会在相同的连接上提供建立“用户会话”的能力,也不提供有效建立事务的能力。实际上,从严格意义上来讲,持久连接不会提供任何非持久连接无法提供的特殊功能。

这就是PHP中的连接持久化,不过它也指出了,持久连接不会提供任何非持久连接无法提供的特殊功能。这就很让人疑惑了,不是说好了这个方案可以带来性能的提升吗?

连接持久化有什么用?

没错,从上述定义中指出的特殊功能来看,持久化连接确实没有带来新的或者更高级的功能,但是它最大的用处正是提升了效率,也就是性能会带来提升。

当Web Server创建到SQL服务器的连接耗费(Overhead)较高(如耗时较久,消耗临时内存较多)时,持久连接将更加高效。

也就是说连接耗费高的时候,创建数据库连接的成本开销也会越大,时间当然也越长。使用持久化连接之后,使得每个子进程在其生命周期中只做一次连接操作,而非每次在处理一个页面时都要向SQL 服务器提出连接请求。这也就是说,每个子进程将对服务器建立各自独立的持久连接。

例如,如果有 20 个不同的子进程运行某脚本建立了持久的 SQL 服务器持久连接,那么实际上向该 SQL 服务器建立了 20 个不同的持久连接,每个进程占有一个。

效率对比

话不多说,我们直接通过代码来对比。首先,我们定义好一个统计函数,用来返回当前的毫秒时间。另外,我们还要准备好数据的连接参数。


function getmicrotime()
{
    list($usec, $sec) = explode(" ", microtime());
    return ((float) $usec + (float) $sec);
}

$db = [
    'server' => 'localhost:3306',
    'user' => 'root',
    'password' => '',
    'database' => 'blog_test',
];

接下来,我们先使用普通的 mysqli 进行测试。


$startTime = getmicrotime();
for ($i = 0; $i < 1000; $i++) {
    $mysqli = new mysqli($db["server"], $db["user"], $db["password"], $db["database"]); //持久连接
    $mysqli->close();
}
echo bcsub(getmicrotime(), $startTime, 10), PHP_EOL;
// 6.5814000000

在 1000 次的循环创建数据库的连接过程中,我们消耗了6秒多的时间。接下来我们使用持久化连接的方式进行这 1000 次的数据库连接创建。只需要在 mysqli 的 $host 参数前加上一个 p: 即可。


$startTime = getmicrotime();
for ($i = 0; $i < 1000; $i++) {
    $mysqli = new mysqli('p:' . $db["server"], $db["user"], $db["password"], $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.0398000000

PDO 方式连接时,需要给一个 PDO::ATTR_PERSISTENT 参数并设置为 true 。这样就让 PDO 建立的连接也成为了持久化的连接。

注意

既然数据库的持久化连接这么强大,为什么不默认就是这种持久化的连接形式,而需要我们手动增加参数来实现呢?PHP 的开发者们当然还是有顾虑的。

如果持久连接的子进程数目超过了设定的数据库连接数限制,系统将会产生一些问题。如果数据库的同时连接数限制为 16,而在繁忙会话的情况下,有 17 个线程试图连接,那么有一个线程将无法连接。如果这个时候,在脚本中出现了使得连接无法关闭的错误(例如无限循环),则该数据库的 16 个连接将迅速地受到影响。

同时,表锁和事务也有需要注意的地方。

在持久连接中使用数据表锁时,如果脚本不管什么原因无法释放该数据表锁,其随后使用相同连接的脚本将会被持久的阻塞,使得需要重新启动 httpd 服务或者数据库服务

在使用事务处理时,如果脚本在事务阻塞产生前结束,则该阻塞也会影响到使用相同连接的下一个脚本

所以,在使用表锁及事务的情况下,最好还是不要使用持久化的数据库连接。不过好在持久连接和普通连接是可以在任何时候互换的,我们定义两种连接形式,在不同的情况下使用不同的连接即可解决类似的问题。

总结

事物总有两面性,持久连接一方面带来了效率的提升,但另一方面也可能带来一些业务逻辑上的问题,而且这种问题如果在不了解持久连接的机制的情况下会非常难排查。因此,在日常开发中我们一定要在了解相关功能特性的情况下再选择适合的方式来完成所需要的功能开发。

测试代码:

github.com/zhangyue050…

以上就是详解PHP中的数据库连接持久化的详细内容,更多关于PHP 数据库连接持久化的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

详解PHP中的数据库连接持久化

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

PHP中数据库实现连接持久化的方法

这篇文章将为大家详细讲解有关PHP中数据库实现连接持久化的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。php的框架有哪些php的框架:1、Laravel,Laravel是一款免费并且开源的PHP应用
2023-06-15

使用PHP怎么实现数据库连接持久化

本篇文章给大家分享的是有关使用PHP怎么实现数据库连接持久化,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。PHP中的数据库连接持久化数据库的优化是我们做web开发的重中之重,甚
2023-06-15

详解 ZooKeeper 数据持久化

们通过之前的文章有介绍过,小S(Sync)负责对办事处的数据进行归档,所以今天他就是我们的主角,让我们一起深入了解他的日常工作吧!

Redis数据类型持久化详解

Redis数据类型能持久化吗?引言Redis是一种高性能的键值存储系统,广泛应用于各种场景。其中,数据类型的持久化是使用Redis时必须考虑的问题之一。本文将探讨Redis中的数据类型是否能够实现持久化,以及如何实现数据类型的持久化。一
Redis数据类型持久化详解
redis2024-12-18

php连接数据库不支持中文如何解决

这篇文章主要介绍“php连接数据库不支持中文如何解决”,在日常操作中,相信很多人在php连接数据库不支持中文如何解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php连接数据库不支持中文如何解决”的疑惑有所
2023-07-05

iOS数据持久化KeyChain数据操作详解

这篇文章主要为大家介绍了iOS数据持久化KeyChain,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-02-03

PHP数据库连接中的事务处理机制详解

php 中的事务处理机制旨在确保数据库操作的完整性,它允许一组操作要么全部执行,要么都不执行。实现方式包括开启事务、执行操作,以及根据情况提交或回滚事务。通过使用事务处理,可以确保数据库在更新过程中始终保持一致。PHP 数据库连接中的事务处
PHP数据库连接中的事务处理机制详解
2024-05-21

数据持久化的利器,Python中的Pickle模块详解

Pickle是Python标准库中的一个模块,用于将Python对象序列化(Pickling)为二进制数据,以及从二进制数据反序列化(Unpickling)为Python对象。这个模块对于在不同的Python程序之间传递数据或将数据存储到文

PHP接口性能优化之数据库连接优化(如何优化PHP接口中的数据库连接以提升性能?)

PHP接口性能优化之数据库连接优化是提升性能的关键,可以通过以下方法实现:数据库连接池:预定义持久连接池,避免重复建立连接。数据库连接持久化:建立不会断开的连接,加快数据库操作。限制同时连接数:防止服务器过载,设置最大连接数限制。使用预处理语句:编译SQL语句,减少数据库处理时间。查询缓存:缓存经常执行查询的结果,避免重复查询。并发查询:并行执行多个数据库查询,提高效率。数据库索引:创建索引加速数据查找,缩短查询时间。数据库优化:定期优化数据库,消除碎片,改善性能。
PHP接口性能优化之数据库连接优化(如何优化PHP接口中的数据库连接以提升性能?)
2024-04-02

php连接数据库不支持中文怎么办

php连接数据库不支持中文的解决办法:1、打开相应的php文件,加入代码为“mysqli_query($conn , "set names utf8");”;2、在文件开头添加“header("content-Type: text/html; charset=utf-8");”即可。
2023-05-14

Android数据持久化之Preferences机制详解

本文实例讲述了Android数据持久化之Preferences机制。分享给大家供大家参考,具体如下:在Android中,实现数据持久化有五种方式:Preferences,文件File,I/O操作、SQLite数据库,ContentProvi
2023-05-31

pycharm中连接mysql数据库的步骤详解

前言 最近在新的环境配置pycharm的项目时候,发现pycharm不能连接到mysql数据库。由于安了java环境但是还没配置相关的库,并且jetbrains家的IDE一般都是java写的,于是猜想可能是java缺少mysql的驱动。所以
2022-06-04

Android数据持久化之I/O操作详解

本文实例讲述了Android数据持久化之I/O操作。分享给大家供大家参考,具体如下:前面文章里我们简单的介绍了File的操作,这一节来说说使用android平台自带对象实现文件的基本操作主要的两个类:openFileOutput(写)和op
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录