0

0

完全掌握php实现mysql连接池效果实现方法

小云云

小云云

发布时间:2018-01-27 09:19:06

|

2899人浏览过

|

来源于php中文网

原创

循环从mysql连接池中获取连接,不需要重复创建新的连接。本文主要介绍了php代码实现mysql连接池效果,需要的朋友可以参考下,希望能帮助到大家。

参考配置修改:可以参考下面的文章

防止访问量过大,把连接数占满了


 true);

    for ($i=0; $i < self::POOLSIZE; $i++) { 
      $connection = new PDO("mysql:dbname=$db;host=$host", $username, $password);
      // sleep(3);
      array_push($this->_pools, $connection);
    }
  }

  //从数据库连接池中获取一个数据库链接资源
  public function getConnection()
  {
    echo 'get' . count($this->_pools) . "
"; if (count($this->_pools) > 0) { $one = array_pop($this->_pools); echo 'getAfter' . count($this->_pools) . "
"; return $one; } else { throw new ErrorException ( "数据库连接池中已无链接资源,请稍后重试!" ); } } //将用完的数据库链接资源放回到数据库连接池 public function release($conn) { echo 'release' . count($this->_pools) . "
"; if (count($this->_pools) >= self::POOLSIZE) { throw new ErrorException ( "数据库连接池已满!" ); } else { array_push($this->_pools, $conn); // $conn = null; echo 'releaseAfter' . count($this->_pools) . "
"; } } public function query($sql) { try { $conn = $this->getConnection(); $res = $conn->query($sql); $this->release($conn); return $res; } catch (ErrorException $e) { print 'error:' . $e->getMessage(); die; } } public function queryAll($sql) { try { $conn = $this->getConnection(); $sth = $conn->prepare($sql); $sth->execute(); $result = $sth->fetchAll(); return $result; } catch (PDOException $e) { print 'error:' . $e->getMessage(); die; } } }

在另外的文件这样调用


query($sql);
  // var_dump($res) . PHP_EOL;
}

ThinkPHP连接MySQL的连接池使用方法

立即学习PHP免费学习笔记(深入)”;

因为一个小bug,导致项目在某个晚上向mysql发送了大量的连接请求,同时mysql服务器的dns出现问题,导致反解超时。最后活活的把mysql服务器拖挂了。

最后bug修复了,并研究了一下增加 mysql连接池的办法。

这两天搜了一下,发现ThinkPHP文档里没有连接池的相关文档。所以自己研究了下代码。

首先: PHP常用的mysql扩展库有三种 : mysql, mysqli, pdo_mysql.

* mysqli 是不支持连接池的。
* pdo_mysql 支持,但是,thinkPHP的pdo扩展不支持mysql,仅支持:'MSSQL','ORACLE','Ibase','OCI' . ( 见 Pdo.class.php 的第59行)

* mysql 支持,通过方法:mysql_pconnect . (具体参数可以看php官方文档)

1 使ThinkPHP启用 长连接的方式是:


class BaseMysql extends Model {
  protected $connection = array(
    'db_type' => 'mysql',
    'db_user' => '***',
    'db_pwd' => '*******',
    'db_host' => '*******',
    'db_port' => '3306',
    'db_name' => 'custom',
    'db_params' => array('persist' => true),
  );
}

如果你认为,配置这个就万事大吉了,那就大错特错了。

Cursor
Cursor

一个新的IDE,使用AI来帮助您重构、理解、调试和编写代码。

下载

2 mysql -> my.cnf修改配置:
[mysqld]

interactive_timeout =60 // 交互连接(mysql-client)的过期时间。
wait_timeout =30 // 长连接的过期时间时间。 这个一定要改啊!默认是8个小时。 如果请求量大点,很快连接数就占满了。
max_connections = 100 //最大连接数,可以认为是连接池的大小

3 php.ini 修改:
[MySql]
mysql.allow_persistent = On
mysql.max_persistent = 99 // 要小于mysql配置的最大连接数
mysql.max_links = 99

4 webserver如果是apache ,需要启用keep-alive。 否则,一旦请求退出,长连接将无法再重用。
webserver 是nginx的情况:
pm = dynamic // 默认启动一些子进程,用于处理http请求。
pm.max_children // 最大的子进程数。 这个配置要小于 mysql 的max_connections。

5 如果发现还是不能用,请检查操作系统的keepalive 是否启用。

综述:

需要 keep-alive 和 数据库长连接同时启用,否则长连接回白白的占用mysql的连接数资源,而无法重用。
对于 nginx + php-fpm 的情况,其实是保持了 php-fpm 子进程与mysql的长连接。 前端的http请求被分配给哪个 php-fpm子进程,该子进程就重用自己与mysql 的长连接。

相关推荐:

连接池配置的10篇内容推荐

PHP实现数据库连接池的具体分析

转一个SQL Ralay数据库连接池的PHP操作类

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

c++ 字符串格式化
c++ 字符串格式化

本专题整合了c++字符串格式化用法、输出技巧、实践等等内容,阅读专题下面的文章了解更多详细内容。

9

2026.01.30

java 字符串格式化
java 字符串格式化

本专题整合了java如何进行字符串格式化相关教程、使用解析、方法详解等等内容。阅读专题下面的文章了解更多详细教程。

12

2026.01.30

python 字符串格式化
python 字符串格式化

本专题整合了python字符串格式化教程、实践、方法、进阶等等相关内容,阅读专题下面的文章了解更多详细操作。

4

2026.01.30

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

20

2026.01.29

java配置环境变量教程合集
java配置环境变量教程合集

本专题整合了java配置环境变量设置、步骤、安装jdk、避免冲突等等相关内容,阅读专题下面的文章了解更多详细操作。

18

2026.01.29

java成品学习网站推荐大全
java成品学习网站推荐大全

本专题整合了java成品网站、在线成品网站源码、源码入口等等相关内容,阅读专题下面的文章了解更多详细推荐内容。

19

2026.01.29

Java字符串处理使用教程合集
Java字符串处理使用教程合集

本专题整合了Java字符串截取、处理、使用、实战等等教程内容,阅读专题下面的文章了解详细操作教程。

3

2026.01.29

Java空对象相关教程合集
Java空对象相关教程合集

本专题整合了Java空对象相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 816人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号