引言
PHP 仍然是 Web 开发中最流行的语言之一:WordPress、Laravel、Symfony 以及数百万个网站都运行在它之上。然而,随着负载的增长,PHP 应用程序的性能可能成为瓶颈。页面加载缓慢不仅会降低用户体验,还会降低在搜索引擎结果中的排名(Google 会考虑 Core Web Vitals)。
在本文中,我们将探讨经过验证的 PHP 优化方法,这些方法可以帮助您在不完全重写代码的情况下加速应用程序。您将了解缓存、解释器配置、数据库优化和性能分析。
1. 缓存:迈向速度的第一步
缓存是减少响应时间最有效的方法。与其每次都执行繁重的操作,不如保存结果并从缓存中提供。
1.1. OpCache (PHP 7/8)
PHP 是一种解释型语言:每次请求时,它都会将脚本编译成操作码(字节码)。OpCache 将编译后的操作码保存在 RAM 中,从而避免重复编译。这可以带来 30-50% 的性能提升。
如何启用: 打开 php.ini 并确保参数已配置:
opcache.enable=1opcache.memory_consumption=128opcache.max_accelerated_files=10000opcache.revalidate_freq=2对于生产环境,设置 opcache.revalidate_freq=0 并在部署时手动刷新缓存。
1.2. 数据缓存 (Redis / Memcached)
如果您的应用程序执行昂贵的数据库查询或外部 API 调用,请使用内存存储。
使用 Redis 的示例:
<?php$redis = new Redis();$redis->connect('127.0.0.1', 6379);
$cacheKey = 'user_profile_' . $userId;$profile = $redis->get($cacheKey);
if (!$profile) { // 昂贵的数据库查询 $profile = getUserProfileFromDB($userId); $redis->setex($cacheKey, 3600, serialize($profile)); // TTL 1 小时}
$profile = unserialize($profile);1.3. HTML 缓存 (全页缓存)
对于静态或很少更新的页面(博客、落地页),您可以缓存完整的 HTML 输出。在 Laravel 中,这通过 middleware 实现;在 Symfony 中,通过 HTTP cache 实现。
2. SQL 查询和数据库优化
PHP 应用程序最常见的瓶颈是数据库。慢查询会消耗服务器资源。
2.1. 使用索引
确保参与 WHERE、JOIN 和 ORDER BY 的列上有索引。您可以通过 EXPLAIN SELECT ... 进行检查。
糟糕的查询(无索引):
SELECT * FROM orders WHERE status = 'pending';好的查询(有索引):
CREATE INDEX idx_orders_status ON orders (status);SELECT * FROM orders WHERE status = 'pending';2.2. 避免 N+1 查询
这是 ORM 的经典错误:在循环中为每条记录获取数据。
问题 (Laravel Eloquent):
$users = User::all();foreach ($users as $user) { echo $user->profile->bio; // 每次都执行新查询}解决方案(预加载):
$users = User::with('profile')->get();foreach ($users as $user) { echo $user->profile->bio; // 一次查询}2.3. 使用分页代替大偏移量的 LIMIT
当使用 LIMIT 10 OFFSET 100000 时,MySQL 仍然需要扫描 100010 行。请使用基于游标的分页(按索引查找):
SELECT * FROM posts WHERE id > $lastId ORDER BY id ASC LIMIT 10;3. 代码和架构优化
即使拥有理想的数据库和缓存,糟糕的代码仍