引言
PHP 应用性能是任何 Web 项目成功的关键因素之一。缓慢的网站不仅会使用户流失,还会对 SEO 排名产生负面影响。本文将介绍优化 PHP 代码和服务器基础设施的主要方法,帮助加速你的应用程序。
优化并非一次性操作,而是一个持续的过程。让我们从最有效、能带来最大性能提升的技术开始。
1. 数据缓存
缓存是加速 PHP 应用最强大的工具之一。不必每次都从头生成响应,你可以保存结果并从缓存中直接提供。
1.1. 内存缓存(Redis/Memcached)
使用 Redis 或 Memcached 等内存缓存系统。它们非常适合存储复杂查询的结果、会话以及频繁请求的数据。
<?php// 使用 Redis 进行缓存的示例$redis = new Redis();$redis->connect('127.0.0.1', 6379);
$cacheKey = 'user_profile_' . $userId;$profile = $redis->get($cacheKey);
if ($profile === false) { // 数据不在缓存中 — 执行繁重查询 $profile = getUserProfileFromDatabase($userId); $redis->setex($cacheKey, 3600, serialize($profile)); // 缓存1小时}
$profile = unserialize($profile);?>1.2. HTML 输出缓存(全页面缓存)
对于静态页面或很少更改的页面,可以使用已生成 HTML 的缓存。这可以通过 Varnish 或流行框架(例如 Symfony HTTP Cache)的内置缓存来实现。
2. 数据库优化
数据库常常成为瓶颈。优化查询和数据库结构可以显著提升速度。
2.1. 使用索引
确保所有参与 WHERE、JOIN 和 ORDER BY 条件的列都已建立索引。这可以将搜索速度提升数十倍。
2.2. 使用 EXPLAIN 优化查询
在执行复杂查询之前,使用 EXPLAIN 命令来了解 MySQL 如何执行它。留意 "Using filesort" 或 "Using temporary" —— 这些都是查询非最优的标志。
<?php// 糟糕:N+1 查询$users = $db->query("SELECT * FROM users");foreach ($users as $user) { $posts = $db->query("SELECT * FROM posts WHERE user_id = " . $user['id']); // ...}
// 优良:使用 JOIN 的单次查询$users = $db->query(" SELECT u.*, p.title as post_title FROM users u LEFT JOIN posts p ON p.user_id = u.id");?>2.3. 使用分页代替大偏移量 LIMIT
使用带有大偏移量(OFFSET)的 LIMIT 会迫使数据库扫描大量行。请使用基于游标的分页方式(WHERE id > last_id)。
<?php// 糟糕:LIMIT 100000, 20$stmt = $db->query("SELECT * FROM articles ORDER BY id LIMIT 100000, 20");
// 优良:基于游标的分页$lastId = $_GET['last_id'] ?? 0;$stmt = $db->query("SELECT * FROM articles WHERE id > $lastId ORDER BY id LIMIT 20");?>3. 使用 OPcache 与类自动加载
PHP 是一种解释型语言,每个请求都需要编译脚本。OPcache 通过在内存中存储编译后的代码来解决此问题。
3.1. 配置 OPcache
确保 OPcache 已启用并正确配置。以下是适用于大多数项目的优化参数:
; php.iniopcache.enable=1opcache.memory_consumption=128opcache.interned_strings_buffer=8opcache.max_accelerated_files=10000opcache.revalidate_freq=2opcache.fast_shutdown=13.2. 正确的类自动加载
使用 Composer 进行类自动加载。这样可以只加载需要的类,从而