谈谈 PHP-FPM 模式下的 MySQL 持久连接

本贴最后更新于 2380 天前,其中的信息可能已经天翻地覆

闲来无事研究一下 PHP 的 MySQL 持久连接问题。在 mysql 扩展的年代,应该用的是 mysql_pconnect,可是那时候我还没有开始接触 PHP, 所以我们直接上 PDO。

首先说一下本次测试用的环境。

imagepng
关键还要看一下 PHP 的配置。

imagepng

注意其中的最重要的参数 pm.max_children=1, 这决定了只能有一个 FPM 的 worker 进程来处理所有请求。这样把问题简化更容易发现特征。

我们知道, PHP 的 FPM 有一个 master 进程和若干个 worker 进程, 而 worker 进程并不是像最早的 fastcgi 一样每次处理完一个请求之后就销毁, 下次再来请求需要重新启动。也就是说一个 worker 进程是可以处理多个请求的。这给“持久连接”提供了理论基础。 那么到底它能不能支持持久连接呢?如果支持持久连接, 它的特征又是什么呢?下面直接上代码。

imagepng

我在之前的文章里也提到过 MySQL 的 general_log,按这里的描述配置一下就可以很清晰的看到哪个连接在请求服务器了。

反复执行 curl http://fpm.org/index.php(我给 fpm.org 配置了 hosts), 就可以看到不断变化的 lastInsertId 了。 但这不是重点, 要看两个现象。

用 root 账户登录 mysql, 执行 show processlist; 可以看到类似如下的输出:

imagepng

可以看到, 有两个客户端和服务器保持了连接。是谁呢?第一个是 Ubuntu(其实是 Debian)维护的 MySQL 包自带的默认管理员用户, 其实表示的就是当前的这个 MySQL cli 连接。另外一个当然就是刚才调用 curl 通过 PHP 的 pdo 创建的了。

imagepng

现在再来看 general_log,

imagepng

可以看到多次请求服务器端都是同一个线程 ID(14). 参考这里

那么怎么验证它是由当前这个 FPM 的 worker 维持的呢?很简单, 重启一下 FPM 再看它有没有变化就知道了。

sudo systemctl restart php-fpm.service

imagepng

可以看到一个新的 worker 已经在工作了。 现在重新访问刚才的地址

先再去执行一下 show processlist;

imagepng

可以看到 14 已经不在了。因为维持 14 这个连接的 fpm worker 已经挂了,当然对应的服务器的线程也已经销毁了。但 15 出现了。那么这几次请求用的是不是 15 呢?

当然是。

imagepng

所以结论很明显了,在 FPM 模式下是可以使用 mysql 持久化连接的。
所以理论上也可以实现 MySQL 连接池。有时间可以研究一下。 想了想是没有办法实现连接池的, 因为一个 worker 只能维持一个长连接,无法和别的 worker 共享, 只能通过配置 pm.max_children 来让 FPM 维持的长连接没有那么多不要超过 MySQL 的最大连接数.

不过这是一个危险操作, 因为你也看到了, 我在写这篇文章的过程中在没有手动重启 FPM 进程之前这个长连接是一直保持的,而如果这个 fpm 进程是空闲的, 那么这个连接就是被浪费的。这有可能导致大量无用的连接占用 MySQL 的连接数, 而连接数是有上限的,超过之后就无法再建立新的连接, 导致后续的连接失败。所以必须设置长连接数的上限, 同时保证 worker 空闲一段时间后退出,(使用 pm.max_spare_servers 实现)或者再处理若干次请求之后重新启动(通过 pm.max_requests 实现), 以保证 MySQL 的正常连接数。

  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3453 回帖 • 203 关注
  • FPM
    2 引用 • 2 回帖
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    690 引用 • 535 回帖
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    179 引用 • 407 回帖 • 488 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 倾城之链
    23 引用 • 66 回帖 • 137 关注
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖 • 3 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    21 引用 • 37 回帖 • 545 关注
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    209 引用 • 358 回帖
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 453 关注
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    77 引用 • 430 回帖 • 2 关注
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 587 关注
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 9 关注
  • V2Ray
    1 引用 • 15 回帖 • 1 关注
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    497 引用 • 1387 回帖 • 283 关注
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    90 引用 • 899 回帖
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 585 关注
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖
  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    17 引用 • 236 回帖 • 325 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 432 关注
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    85 引用 • 165 回帖 • 1 关注
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    71 引用 • 535 回帖 • 786 关注
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    36 引用 • 35 回帖
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 167 关注
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 624 关注
  • 创业

    你比 99% 的人都优秀么?

    84 引用 • 1399 回帖 • 1 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    25 引用 • 191 回帖 • 16 关注
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 47 关注