引言:为什么PHP中需要缓存
任何现代PHP Web应用都会面临性能问题。每次数据库查询、配置文件读取或复杂HTML模板的渲染都需要消耗服务器时间和资源。缓存是一种技术,它允许你将耗时的操作结果保存在快速存储中,这样在后续请求时,可以直接即时提供已准备好的数据。
PHP有多个缓存层级:从内置的字节码缓存(OPcache)到Redis和Memcached等分布式系统。在本文中,我们将详细讲解如何以及何时使用这些工具,以便你的网站运行更快、处理更多负载并节省资源。
内置解决方案:OPcache和APCu
在接入外部服务之前,值得先看看PHP"开箱即用"提供了什么。两个关键机制——OPcache和APCu——可以在不安装额外软件的情况下显著提升性能。
OPcache:字节码缓存
每次PHP执行脚本时,都会将其编译为字节码(opcode)。OPcache将此字节码存储在共享内存中,从而在后续请求时跳过编译阶段。这对于框架(Laravel、Symfony)和CMS(WordPress、Drupal)尤其有效,因为每次请求都会加载数十个文件。
php.ini中的配置:
opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
建议在所有生产服务器上启用OPcache。这可以说是将PHP应用加速20-40%的最简单方法。
APCu:用户数据缓存
APCu(替代PHP缓存)提供了一个简单的接口,用于在共享内存中存储任意数据。与缓存代码的OPcache不同,APCu存储计算结果:数据库数据、序列化对象、HTML片段。
缓存SQL查询结果的示例:
// 保存数据300秒
$key = 'users_list';
$data = apcu_fetch($key, $success);
if (!$success) {
$data = $db->query("SELECT * FROM users")->fetchAll();
apcu_store($key, $data, 300);
}
return $data;
APCu非常适合单页应用或单服务器项目。但是,它的数据存储在本地,当使用多服务器(水平扩展)时,你需要一个分布式解决方案。
Memcached:简单快速的分布式缓存
Memcached是一个高性能缓存系统,运行在RAM中。它旨在通过减少数据库负载来加速动态Web应用。主要优点是简单、快速以及对分布式存储的支持。
安装PHP扩展:
pecl install memcached
连接和操作示例:
$memcached = new Memcached();
$memcached->addServer('localhost', 11211);
$key = 'article_123';
$cached = $memcached->get($key);
if ($cached === false) {
$article = getArticleFromDB(123);
$memcached->set($key, $article, 3600); // 缓存1小时
} else {
$article = $cached;
}
Memcached不支持复杂数据结构(仅支持字符串和二进制对象),但它完美胜任"经典"缓存任务:通过键存储数据,通过键获取数据。需要注意的是,Memcached没有内置持久化——重启服务器时所有数据都会丢失。
Redis:强大而灵活的缓存工具
Redis不仅仅是缓存,更是一个全功能的内存数据存储,支持持久化、事务和复杂数据结构(列表、集合、哈希、队列)。对于PHP开发者来说,Red