PHP缓存:Redis、Memcached及内置加速方案

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么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

博客

书籍推荐