深入探讨:PHP使用数据库永久连接方式操作MySQL的是与非

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,说不定会有惊喜。

(0)

相关推荐

  • php中mysql连接和基本操作代码(快速测试使用,简单方便)

    偶尔要用到php做一些mysql数据库的操作测试,自己写起来太麻烦,搜索的结果一般都又包含一大堆没用的代码,这里将php mysql的操作做一下总结,希望以后用到的时候不用再感到麻烦了. 复制代码 代码如下: <?php$dbhost='localhost';//数据库服务器名称$dbuser='root';// 连接数据库用户名$dbpass='123456';// 连接数据库密码$dbname='products';// 数据库的名字 // 连接到数据库$connect=mysql_conn

  • php mysql操作mysql_connect连接数据库实例详解

    mysql_connect介绍 php mysql_connect用于连接mysql服务器,该函数有多个参数,但我们一般只需要了解以下三个参数即可: mysql_connect(server,user,pwd) 参数介绍: server -- mysql服务器地址 user -- 服务器用户名 pwd -- 服务器登录密码 如果连接成功,则返回一个 MySQL 连接标识,如果连接失败则返回 FALSE.  mysql_connect实例 <?php $host="mysql153.secu

  • PHP连接MySQL进行增、删、改、查操作

    话不多说,请看代码: <table width="100%" border="1" cellpadding="0" cellspacing="0"> <tr> <td>代号</td> <td>姓名</td> <td>性别</td> <td>民族</td> <td>生日</td> <

  • PHP连接和操作MySQL数据库基础教程

    从这里开始 我的博客,后台数据库是什么?没错,就是MySQL,服务器端使用的脚本就是PHP,整个框架使用的是WordPress.PHP和MySQL就像夫妻一样,总是在一起干活.现在这里,就集合PHP,总结一下MySQL的实际使用,也算作是MySQL开发的入门.关于PHP与MySQL的合作,不外乎以下三种方法: 1.mysql扩展:但是目前已经不推荐使用: 2.mysqli扩展:同时提供面向对象风格和面向过程的风格:要求MySQL版本是4.1及以上的: 3.PDO扩展为PHP访问数据库定义了一种轻

  • php连接不上mysql但mysql命令行操作正常的解决方法

    故障状况:php网站连接mysql失败,但在命令行下通过mysql命令可登录并正常操作.解决方案:1.命令行下登录mysql,执行以下命令: 复制代码 代码如下: show variables like 'socket'; 执行后会得到类似于如下回显: 复制代码 代码如下: "Variable_name"        "Value""socket"                  "/home/mysql/data/mysql.so

  • PHP入门教程之使用Mysqli操作数据库的方法(连接,查询,事务回滚等)

    本文实例讲述了PHP入门教程之使用Mysqli操作数据库的方法.分享给大家供大家参考,具体如下: Demo1.php <?php //使用 mysqli 对象操作数据库 //创建 mysqli 对象(资源句柄) $_mysqli = new mysqli(); //连接数据库 1.主机名(ip) 2.账户 3.密码 4.数据库 //mysqli_connect 函数 == $_mysqli -> connect(); $_mysqli -> connect('localhost','ro

  • thinkphp3.x连接mysql数据库的方法(具体操作步骤)

    本文实例讲述了thinkphp3.x连接mysql数据库的方法.分享给大家供大家参考,具体如下: 惯例配置文件:ThinkPHP/conf/convention.php (1)在配置文件中填写配置信息(配置文件:"./xmall/conf/config.php"): 示例: <?php return array( //'配置项'=>'配置值' /* 数据库设置 */ 'DB_TYPE' => 'mysql', // 数据库类型 'DB_HOST' => 'loc

  • php实现mysql数据库连接操作及用户管理

    文件列表..文件内容.. dbconn.php userListt.php editUser.php editDo.php detailUser.php deleteUser.php addUser.php addDo.php <dbconn.php> <?php // 创建数据库连接 $con = mysql_connect("localhost",'root','') or die('error:'.mysql_error()); mysql_select_db(

  • PHP连接MySQL数据的操作要点

    MySQL扩展库操作MySQL数据库的步骤如下: 1:获取连接. 2:选取书库. 3:设置操作编码. 4:发送SQL指令(MySQL数据库可以分为四种指令: 4.1:ddl: 数据定义语言. 4.2:dml:数据操语言(如CURD): 4.3:dql:数据查询语言.(如select) 4.4:dtl:数据事物语言. 5:接收返回结果,并且处理. 6:断开连接. 具体的示例代码如下: 复制代码 代码如下: <?php  //1:连接数据库      $con=mysql_connect("l

  • 深入探讨:PHP使用数据库永久连接方式操作MySQL的是与非

    PHP程序员应该都知道连接MySQL数据库可以使用mysql_pconnect(永久连接)函数,使用数据库永久连接可以提高效率,但是实际应用中数据库永久连接往往会导致出现一些问题,通常的表现就是在大访问量的网站上时常发生断断续续的无法连接数据库的情况,出现类似"Too many connections in ..."的错误提示信息,重新启动服务器又正常了,但过不了一会儿又出现同样的故障.对于这些问题的成因,恐怕就不是每个人都能说清楚的了,虽然PHP文档里有一些相关资料,但是解释的并不浅显易懂,这

  • PHP基于ORM方式操作MySQL数据库实例

    本文实例讲述了PHP基于ORM方式操作MySQL数据库.分享给大家供大家参考,具体如下: ORM----Oriented Relationship Mapper,即用面向对象的方式来操作数据库.归根结底,还是对于SQL语句的封装. 首先,我们的数据库有如下一张表: 我们希望能够对这张表,利用setUserid("11111"),即可以设置userid:getUserid()既可以获得对象的userid.所以,我们需要建立model对象,与数据库中的表对应. 由于每张表所对应的model

  • Python3 多线程(连接池)操作MySQL插入数据

    多线程(连接池)操作MySQL插入数据 针对于此篇博客的收获心得: 首先是可以构建连接数据库的连接池,这样可以多开启连接,同一时间连接不同的数据表进行查询,插入,为多线程进行操作数据库打基础 多线程根据多连接的方式,需求中要完成多语言的入库操作,我们可以启用多线程对不同语言数据进行并行操作 在插入过程中,一条一插入,比较浪费时间,我们可以把数据进行积累,积累到一定的条数的时候,执行一条sql命令,一次性将多条数据插入到数据库中,节省时间cur.executemany 1.主要模块 DBUtils

  • Python2.7简单连接与操作MySQL的方法

    本文实例讲述了Python2.7简单连接与操作MySQL的方法.分享给大家供大家参考,具体如下: Python号称简单优雅,其实新手摆弄一些东西的时候还是挺麻烦的,比如使用Python2.7连接MySQL数据库时,真是有点麻烦.现将方法整理出来. 环境:Python2.7.2.MySQL5.5 1.安装MySQL驱动程序.下载自动安装包,双击安装即可,非常简单. 2.连接MySQL,下面是Python示例代码. # -*- coding: utf8 -*- import MySQLdb conn

  • Python的SQLalchemy模块连接与操作MySQL的基础示例

    一.SQLalchemy简介 SQLAlchemy是一个开源的SQL工具包,基本Python编程语言的MIT许可证而发布的对象关系映射器.SQLAlchemy提供了"一个熟知的企业级全套持久性模式,使用ORM等独立SQLAlchemy的一个优势在于其允许开发人员首先考虑数据模型,并能决定稍后可视化数据的方式. 二.SQLAlchempy的安装 首先需安装mysql,这里就不再多说了..... 然后,下载SQLAlchemy(http://www.sqlalchemy.org/download.h

  • jdbc 数据库的连接(sqlserver oracle)

    1.sql server 2000数据库的连接方式: 复制代码 代码如下: Connection con; public Connection getCon(){ try{ Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");//加载驱动程序 con=DriverManger.getConnection("jdbc:microsoft:sqlServer://localhost:1433;Database

  • C++利用MySQL API连接和操作数据库实例详解

    1.C++连接和操作MySQL的方式 系列文章: MySQL 设计和命令行模式下建立详解 C++利用MySQL API连接和操作数据库实例详解 在Windows平台,我们可以使用ADO.ODBC或者MySQL API进行连接和操作.ADO (ActiveX Data Objects,ActiveX数据对象)是Microsoft提出的一个用于存取数据源的COM组件.它提供了程序语言和统一数据访问方式OLE DB的一个中间层,也就是Microsoft提出的应用程序接口(API)用以实现访问关系或非关

  • Java数据库连接_jdbc-odbc桥连接方式(详解)

    jdbc-odbc桥连接方式操作数据库SU(Course) 步骤: 1.配置数据源 控制面板下搜索管理工具->ODBC数据源(32位)->添加->选择sql server(填写名称mytest,服务器local或者.)->下一步->更改默认的数据库为SU->下一步->测试数据源至成功 用户数据源会多一条mytest,至此配置数据源成功. 2.在程序中连接数据源 打开eclipse,编写程序. public class Demo_1 { public static

  • MySQL 的启动和连接方式实例分析

    本文实例讲述了MySQL 的启动和连接方式.分享给大家供大家参考,具体如下: MySQL运行包括两部分,一部分是服务器端程序mysqld,另外一部分则是客户端程序mysql.只有mysqld启动了,mysql客户端才能与之连接.mysqld的启动方式有4种,同样mysql的连接方式也有4种. mysqld的启动方式 方式1:mysqld mysqld是一个可执行命令,也是服务器端程序,启动这个程序就相当于启动了MySQL服务器端的进程.但这个命令不常用,常用mysqld_safe命令. 命令格式

随机推荐