讲师中心 微信公众号
AI工具推荐 视频效率加速

代码层面如何支持高并发_PHP编程优化的详细指南【教程】

阿晨大大_9840

阿晨大大_9840

发布时间:2026-02-18 16:45:52

|

1022人浏览过

|

来源于php中文网

原创

PHP-FPM应按请求特征选static或dynamic:短接口用static省开销,长耗时用dynamic防阻塞;需配连接池、Redis原子操作、避免Swoole硬迁移,并监控周边瓶颈。

代码层面如何支持高并发_php编程优化的详细指南【教程】

PHP-FPM 进程模型选型直接影响并发上限

用 static 还是 dynamic?不是配置越多越快,而是得看请求特征。短平快接口(比如 API)适合 static,省去进程启停开销;但长耗时操作(如文件上传、PDF 生成)用 static 容易把所有 worker 占满,新请求直接排队等死。

  • pm = static:设 pm.max_children 要严格匹配服务器内存,每个 PHP 进程常驻约 20–40MB,超了会触发 OOM Killer 杀进程
  • pm = dynamic:重点调 pm.start_servers、pm.min_spare_servers、pm.max_spare_servers,避免频繁 fork/destroy 进程——这本身就会吃 CPU
  • 别碰 ondemand 模式:高并发下冷启动延迟明显,pm.process_idle_timeout 一到就杀进程,再有请求又得重建,雪上加霜

MySQL 连接池缺失是 PHP 高并发最常踩的坑

PHP 默认不带连接池,mysqli 或 PDO 每次 new 都建新 TCP 连接,数据库端很快堆满 Too many connections。这不是 PHP 慢,是连接没复用。

  • 用 PDO 时必须显式开启持久连接:new PDO($dsn, $user, $pass, [PDO::ATTR_PERSISTENT => true]),否则 PDO::ATTR_PERSISTENT 设了也白设
  • 持久连接不等于“永远不关”,它在请求结束时归还给连接池,但若脚本里 unset($pdo) 或异常退出,连接可能被标记为“损坏”而丢弃
  • MySQL 服务端的 wait_timeout(默认 8 小时)和 PHP 的连接空闲时间要对齐,否则会出现 MySQL server has gone away

Redis 用不好,缓存反而成瓶颈

高频写场景下,set 和 get 看似简单,但没注意原子性或序列化方式,很容易引发缓存击穿或数据错乱。

btpanel phpsite 宝塔面板PHP网站
btpanel phpsite 宝塔面板PHP网站

宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理

下载
  • 别用 get + set 手动双检:竞态下多个请求同时发现缓存为空,全去查 DB,瞬间压垮后端——改用 set($key, $val, ['nx', 'ex' => 60]) 原子写入
  • PHP 序列化默认用 serialize(),和 Python/Node 不兼容;跨语言项目务必统一用 json_encode() + json_decode(),且注意 null 和空数组解码差异
  • 大量小 key 别用单个 get 循环查,改用 mget;但 mget 返回数组顺序固定,别靠下标猜字段名,要用 array_combine($keys, $vals) 对齐

协程不是 PHP 原生能力,别硬套 Swoole 语法到传统 FPM

看到“高并发”就想上 Swoole?先确认你的代码是否真能适配。FPM 下写的 file_get_contents、sleep、mysqli_query 在 Swoole 协程环境里会阻塞整个进程,除非你换 co\curl、Swoole\Coroutine\MySQL 等异步替代品。

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

  • 已有项目迁移前,先跑一遍 vendor/bin/phpstan + 自定义规则,扫描出所有同步 I/O 调用点
  • Swoole\Http\Server 和 PHP-FPM 的生命周期完全不同:没有 $_SESSION、$_COOKIE 自动解析,需手动从 $request->cookie 取
  • 别在协程里用 global 或静态变量存请求上下文,协程切换后值会串——改用 Co::getContext() 或 ApplicationContext

并发量上来之后,真正卡住的往往不是 PHP 本身,而是 MySQL 连接数、Redis 连接超时、DNS 解析阻塞这些“周边环节”。盯着 ab 或 wrk 的结果看平均响应时间没用,得抓 strace -p $(pgrep php-fpm) -e trace=connect,sendto,recvfrom 看哪一步在等。

相关文章

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

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

下载

相关标签:

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

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2353

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

1439

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

835

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3292

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

5628

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

1219

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

5891

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

5122

2023.08.14

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

60

2026.10.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn