本文目录导读:

针对 PHP 项目的加载速度优化,可以从代码层面、数据库层面、缓存层面、Web服务器层面、以及前端层面五个维度进行系统性优化。
下面是一份详细的优化清单,按优先级排序:
代码与架构层面(根本)
-
启用到OPcache(最有效,必做)
- 原理:PHP 是解释型语言,每次请求都会编译成 opcode(操作码),OPcache 将编译后的 opcode 存储在共享内存中,避免重复编译。
- 操作:在
php.ini中开启并配置:opcache.enable=1 opcache.memory_consumption=128 # 根据项目大小调整 opcache.max_accelerated_files=10000 # 项目文件数 opcache.revalidate_freq=60 # 检查文件更新的秒数
-
使用 Composer 自动加载优化
- 操作:生成优化过的 Composer 类映射文件,减少文件系统扫描。
composer dump-autoload -o
- 操作:生成优化过的 Composer 类映射文件,减少文件系统扫描。
-
避免不必要的
require/include- 只加载当前页面必须的类文件,使用 自动加载(PSR-4) 而非手动
require。
- 只加载当前页面必须的类文件,使用 自动加载(PSR-4) 而非手动
-
减少函数调用与循环中的计算
将循环中不变的计算提到循环外,避免重复执行。
-
使用最新 PHP 版本
从 PHP 7.0 到 8.x,每一次大版本更新都有显著性能提升,PHP 8.x 引入了 JIT(即时编译),对 CPU 密集型任务提升很大。
数据库层面(常见瓶颈)
-
慢查询优化
- 使用
EXPLAIN分析SELECT语句,确保查询走了索引(Index)。 - 避免
SELECT *,只取出需要的字段。
- 使用
-
建立适当的索引
- 为
WHERE、JOIN、ORDER BY涉及的字段建立索引。 - 注意:索引不是越多越好,会拖慢写入速度。
- 为
-
使用持久连接
- 如果使用 MySQL,考虑使用
mysqli_pconnect或连接池,避免每次请求都创建和销毁数据库连接。
- 如果使用 MySQL,考虑使用
-
NoSQL 辅助
- 对于高并发读取的热点数据(如用户 session、文章计数),使用 Redis/Memcached 作为缓存层,减少数据库压力。
缓存层面(降低响应时间)
-
页面静态化
- 全站静态化:将不需要动态数据的页面(如文章详情页)生成
.html静态文件,让 Nginx/Apache 直接返回,完全不经过 PHP。
- 全站静态化:将不需要动态数据的页面(如文章详情页)生成
-
应用层缓存
- 使用 Redis 缓存数据库查询结果、API 响应、用户 Session。
- 使用 内存缓存(如 APC/u)或 本地文件缓存。
-
HTTP 缓存头
- 设置
Expires、Cache-Control、Last-Modified头,让浏览器或 CDN 缓存静态资源。
- 设置
Web 服务器层面(请求处理)
-
使用 Nginx + PHP-FPM
- 相比 Apache mod_php,Nginx 处理高并发静态文件的能力更强,通过
FastCGI与 PHP-FPM 通信效率更高。
- 相比 Apache mod_php,Nginx 处理高并发静态文件的能力更强,通过
-
调整 PHP-FPM 进程管理
pm = dynamic(推荐):根据请求量动态调整子进程数。pm.max_children:不要设得过大,防止内存耗尽,公式:max_children = 服务器内存 / 单个 PHP 进程内存。pm.max_requests:设置一个进程处理多少次请求后重启,避免内存泄漏(如设为 1000)。
-
启用 Gzip/Brotli 压缩
- 在 Nginx 中开启
gzip on或brotli,压缩 HTML/JS/CSS 输出,减少带宽占用。
- 在 Nginx 中开启
-
配置 CDN
将静态资源(图片、CSS、JS、字体)托管到 CDN,加速用户下载速度。
前端层面(用户感知速度)
-
合并/压缩资源
- 将多个 CSS 文件合并为一个,JS 同理。
- 使用 Minify(如
webpack、gulp)压缩资源,移除空格、注释、换行。
-
延迟加载
- 图片懒加载(Lazy Load):只加载可视区域的图片。
- JS 异步/延迟:将非核心 JS 标记为
async或defer,不阻塞 HTML 渲染。
-
使用资源提示
- 在
<head>中加:<link rel="preload" href="critical.css" as="style">:预加载关键资源。<link rel="dns-prefetch" href="//example.com">:提前 DNS 解析,加速 CDN 请求。
- 在
性能监控与瓶颈定位
在开始优化前,建议先找出真正的瓶颈:
- 使用 Xdebug/Blackfire/ Tideways 进行 Profiling:定位到底是哪个函数、哪个 SQL 最慢。
- 监控慢查询日志:在 MySQL 中开启
slow_query_log。 - 使用
microtime()打点:手动测量代码段执行时间(临时调试用)。$start = microtime(true); // 你的代码 $end = microtime(true); echo "执行时间: " . ($end - $start) . "秒";
按优先级推荐行动清单
- ✅ 必须做:开启 OPcache + PHP 8.x + CDN 静态资源。
- ✅ 立刻做:优化数据库查询(加索引 + 减少 N+1 问题)+ Composer 优化。
- ✅ 看情况做:页面静态化 + Redis 缓存 + Nginx 配置优化 + 前端资源合并压缩。
最立竿见影的优化往往是 OPcache 和 数据库索引,请优先检查这两项。