引言:为什么速度很重要?
想象一下,您的网站加载时间超过3秒。根据Google的数据,53%的用户会离开,转化率将下降20%。对于PHP开发者来说,掌握优化应用的技巧不仅是“良好习惯”,更是必备技能。即使您刚刚起步,基本的代码加速技术也能帮助您创建快速、响应迅速的项目。
在本文中,我们将探讨4个关键方向:从缓存和数据库操作到服务器配置和性能分析。您将获得现成的代码示例和可实施的检查清单。
1. 缓存:保存结果,而非重新计算
缓存就像考试前准备的小抄。与其每次都重新计算复杂数据,不如将其保存在快速存储中。
1.1. 内存缓存(Memcached / Redis)
对于不常变化的数据(例如分类列表或设置),内存缓存是理想选择。
<?php// 使用 Memcached 的示例$memcached = new Memcached();$memcached->addServer('localhost', 11211);
$key = 'categories_list';$categories = $memcached->get($key);
if ($categories === false) { // 缓存中没有数据——从数据库获取 $categories = $db->query("SELECT * FROM categories")->fetchAll(); // 保存1小时(3600秒) $memcached->set($key, $categories, 3600);}
// 使用 $categoriesforeach ($categories as $cat) { echo $cat['name'];}?>1.2. HTML片段缓存(输出缓冲)
如果存在重量级模块(如小工具、菜单),请缓存生成的HTML。
<?phpfunction getCachedWidget($widgetName, $ttl = 300) { $cacheFile = __DIR__ . '/cache/' . md5($widgetName) . '.html'; if (file_exists($cacheFile) && (time() - filemtime($cacheFile)) < $ttl) { return file_get_contents($cacheFile); } ob_start(); // 此处为生成小工具的代码 echo "<div class='widget'>复杂内容...</div>"; $html = ob_get_clean(); file_put_contents($cacheFile, $html); return $html;}
echo getCachedWidget('sidebar_menu');?>2. 数据库查询优化
PHP应用中最常见的瓶颈是数据库。一个糟糕的查询可能“拖垮”整个网站的性能。
2.1. 使用索引
没有索引,MySQL必须扫描整个表。为参与WHERE、JOIN和ORDER BY的字段添加索引。
-- 糟糕:全表扫描SELECT * FROM users WHERE email = 'test@test.com';
-- 良好:使用索引CREATE INDEX idx_email ON users(email);SELECT * FROM users WHERE email = 'test@test.com';2.2. 避免N+1查询
这是一个经典错误:在循环中为每个元素查询数据库。
<?php// 糟糕:N+1次查询$users = $db->query("SELECT * FROM users")->fetchAll();foreach ($users as $user) { $orders = $db->query("SELECT * FROM orders WHERE user_id = " . $user['id']); // ...}
// 良好:一次查询使用JOIN$users = $db->query(" SELECT u.*, o.* FROM users u LEFT JOIN orders o ON u.id = o.user_id")->fetchAll();?>2.3. 懒加载
不要加载当前不需要的数据。使用分页或LIMIT。
// 替代方案:$all = $db->query("SELECT * FROM logs"); // 100,000行
// 使用:$page = $_GET['page'] ?? 1;$limit = 20;$offset = ($page - 1) * $limit;$logs = $db->query("SELECT * FROM logs LIMIT $limit OFFSET $offset");3. 服务器配置与OPcache
有时问题不在于代码,而在于PHP配置。最强大的优化是——