PHP 程序员 应该都知道连接MySQL数据库可以使用mysql_pconnect(永久连接)函数,使用数据库永久连接可以提高效率,但是实际应用中数据库永久连接往往会导致出现一些问题,通常的表现就是在大访问量的网站上时常发生断断续续的无法连接数据库的情况,出现类似"Too many connections in ..."的错误提示信息,重新启动服务器又正常了,但过不了一会儿又出现同样的故障。对于这些问题的成因,恐怕就不是每个人都能说清楚的了,虽然PHP文档里有一些相关资料,但是解释的并不浅显易懂,这里我厚着脸皮试图做一个简单的讨论,所述观点不见得全都正确,欢迎大家反馈意见。
首 先看看数据库永久连接的定义:
永久的数据库连接是指在脚本结束运行时不关闭的连接。当收到一个永久连接的请求时。PHP 将检查是否已经存在一个(前面已经开启的)相同的永久连接。如果存在,将直接使用这个连接;如果不存在,则建立一个新的连接。所谓“相同”的连接是指用相同的用户名和密码到相同主机的连接。
PHP使用永久连接方式操作MySQL是有前提的:就是PHP必须安装为多线程或多进程Web服务器的插件或模块。最常见的形式是把PHP用作多进程Apache服务器的一个模块。对于一个多进程的服务器,其典型特征是有一个父进程和一组子进程协调运行,其中实际生成Web页面的是子进程。每当客户端向父进程提出请求时,该请求会被传递给还没有被其它的客户端请求占用的子进程。这也就是说当相同的客户端第二次向服务端提出请求时,它将有可能被一个不同的子进程来处理。在开启了一个永久连接后,所有不同子进程请求SQL服务的后继页面都能够重新使用这个已经建立的 SQL服务器连接。它使得每个子进程在其生命周期中只做一次连接操作,而非每次在处理一个页面时都要向 SQL 服务器提出连接请求。每个子进程将对服务器建立各自独立的永久连接。PHP本身并没有数据库连接池的概念,但是Apache有进程池的概念, 一个Apache子进程结束后会被放回进程池, 这也就使得mysql_pconnect打开的的那个mysql连接资源可以不被释放,而是依附在相应的Apache子进程上保存到了进程池中。于是在下一个连接请求时它就可以被复用。一切看起来似乎都很正常,但是在Apache并发访问量大的时候,如果使用mysql_pconnect,会由于之前的 Apache子进程占用的MySQL连接没有close, 很快使MySQL达到最大连接数,使得之后的请求可能得不到响应。
上 面的部分文字是摘抄自PHP文档,看起来可能还是有些文绉绉的不好理解,那么我就用大白话再举一个例子来说明问题:
假设Apache配置最大连接数为1000,MySQL配置最大连接数为100,当Apache服务器接到200个并发访问的时候,其中100个涉及到数据库访问,剩下的100个不涉及数据库访问,因为这个时候还不存在可用的数据库连接,所以这里面涉及到数据库访问的100个并发会同时产生100个数据库永久连接,达到了数据库最大连接数,当这些操作没有结束的时候,任何其他的连接都无法再获得数据库连接,当这些操作结束了,相应的连接会被放入进程池,此时Apache的进程池里就有了200个空闲的子进程,其中100个是带有数据库连接的,由于Apache会为访问请求随机的挑选空闲子进程,所以你得到的子进程很可能是不包含数据库连接的那100个中的一个,而数据库连接已经达到了最大值,你也不可能成功的建立新的数据库连接,唉,你便只好不停的刷新页面,哪个时候运气好,碰巧分配到了带有数据库连接的子进程,才能正常浏览页面。如果是大访问量的网站来说,任何时候都可能存在大量的并发,所以浏览者可能就会不停的发现无法连接数据库的现象了。
或许你会说,我们把Apache和MySQL的最大连接数调成一样大不就可以了么?是的,合理的调整这个最大连接数某种程度上会避免这个问题的发生,但是Apache和MySQL的负载能力是不同的,如果按照Apache的负载能力来设置,对于MySQL来说,这个最大连接数就偏大,会产生大量的 MySQL数据库永久连接,打个比方,就好像和平时代还要养活一个几百万的军队一样,其开销得不偿失;而如果按照Mysql的负载能力设置,对于 Apache来说,这个最大连接数就偏小,有点杀鸡牛刀的感觉,无法发挥Apache的最大效率。
所 以按照PHP手册上的介绍,只适合在并发访问不大的网站上使用数据库永久连接,但对于一个并发访问不大的网站来说,使用数据库永久连接带来的效率提高似乎没有太大的意义,从这个角度上来看,我觉得PHP中的数据库永久连接基本上是一个鸡肋的角色,如果你一定要使用数据库连接池的概念,可以尝试一下sqlrelay 或者Apache本身提供的mod_dbd ,说不定会有惊喜。
分享到:
相关推荐
首先,让我们分析一下使用数据库永久连接方式操作MySQL数据库的场景。PHP程序员在连接MySQL数据库时,可以利用mysql_pconnect函数创建永久连接。这种方式在一定程度上提高了数据库操作的效率,因为它避免了每次请求...
mysql 和 mysqli 都是 PHP 语言中访问 MySQL 数据库的方式,但 mysqli 提供了更多的功能和安全性,建议使用 mysqli 来操作 MySQL 数据库。 知识点: 1. PHP 语言中 mysql 和 mysqli 的应用比较 2. mysql 函数的...
- **非永久性连接关闭**:使用`odbc_close`关闭单个连接,`odbc_close_all`关闭所有连接。 - **永久性连接**:`odbc_pconnect`创建的连接在多次请求间保持,直到服务器关闭或显式关闭。 3. 建立系统DSN(Data ...
在PHP中,使用MySQL事务时,首先需要通过MySQLi或PDO扩展来与数据库建立连接,然后关闭自动提交模式,执行一系列SQL语句,最后根据操作的结果决定是提交还是回滚事务。 ### PHP中的事务处理函数 以下是PHP中使用...
MySQL是世界上最流行的关系型数据库管理系统之一,广泛应用于各种规模的应用中。面试中,对MySQL的知识掌握程度往往是评估候选人技能的重要标准。以下是一些常见的MySQL面试题及其详细解答: 1. **数据库的三范式**...
在MySQL中,删除数据表是一项基本但至关重要的操作。它涉及到对数据库结构的直接修改,因此需要谨慎...在进行任何数据库操作时,都应先测试并在非生产环境中验证代码,以确保它们符合预期并能安全地应用于实际环境。
Catfish Blog很可能使用MySQL作为数据库管理系统,通过PHP的PDO(PHP Data Objects)扩展与数据库进行交互,实现文章的增删改查操作。数据库设计可能包括文章表、用户表、评论表等,以支持博客的基本功能。 4. 用户...
从CentOS 7开始,默认的数据库是MariaDB而非MySQL。执行`yum install -y mariadb mariadb-server`来安装,然后启动服务、设置开机启动,并通过`mysql_secure_installation`进行安全初始化,设定root密码。 接着,...
- **mysql**:用于连接和操作MySQL数据库。 - **gd2**:图形处理库,用于创建和处理图像。 - **pdo**:提供数据访问抽象层,简化了数据库访问接口。 - **curl**:用于发送HTTP请求,实现网页抓取或API调用。 - **...
MySQL数据库在处理并发操作时,为了确保数据的一致性和完整性,使用了事务处理机制。事务是一组数据库操作,这些操作被视为一个逻辑单元,要么全部执行,要么全部回滚。在MySQL中,我们可以使用不同的语句来管理和...
事务将一系列数据库操作视为一个不可分割的工作单位,如果事务中的所有操作都成功执行,那么整个事务就提交并永久保存;如果其中任一操作失败,那么事务将回滚,撤销所有已执行的操作,保持数据一致性。 ### PHP...
以上就是PHP面试中涉及的一些高级知识点,包括网络协议、PHP配置、类型转换、字符串处理、数据库类型、数组操作、函数引用、Session替代方案以及HTTP状态码理解。理解和掌握这些知识点对于PHP开发者来说至关重要,...
- **资源管理器改进**:增强了对资源的管理,如数据库连接等。 - **性能优化**:PHP 5.1在内存管理和性能方面进行了优化,提高了执行效率。 以上是PHP高级工程师面试中可能涉及的一些知识点,深入理解和掌握这些...
8. **PHP与MySQL**:在PHP中,不能读取结果集中记录的函数是mysql_affected_rows(),它用于获取上次操作影响的行数。 9. **收藏夹**:能保存网页地址的文件夹是收藏夹,便于快速访问常用网站。 10. **外键约束**:...
系统基于PHP语言开发,搭配MySQL数据库,旨在简化网站搭建过程,让非专业技术人员也能快速建立属于自己的影视资源分享平台。 在最新的版本中,苹果CMS针对上一代产品进行了一系列的优化,包括但不限于性能提升、...