PHP中的缓存:Redis、Memcached、APCu 和文件缓存

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

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

开始课程

PHP中的缓存:Redis 及其他工具



缓存是优化 PHP Web 应用性能的关键机制之一。正确配置的缓存可以将服务器响应时间缩短 10 到 50 倍,降低数据库负载并减少资源消耗。在本文中,我们将介绍 PHP 中四种主要的缓存方法:Redis、Memcached、APCu 以及经典的文件缓存。



为什么需要在 PHP 中使用缓存?



如果没有缓存,每个 PHP 请求可能会执行数十次 SQL 查询、处理模板并加载外部数据。缓存可以保存代价高昂的操作(例如数据库查询或 XML 解析)的结果,并直接返回,从而避免重复计算。主要应用场景包括:



  • 缓存 SQL 查询结果 — 将 SELECT 查询的结果保存 5 到 60 秒。
  • 缓存 HTML 片段 — 预生成的菜单块、小部件、面包屑导航。
  • 缓存会话 — 将会话数据存储在 Redis 中,而不是文件中。
  • 缓存 API 数据 — 外部服务的响应(如天气、汇率)。
  • 缓存操作码 — 加速 PHP 代码本身的执行(OPcache)。


1. Redis — 内存缓存之王



Redis 是一个高性能的内存键值存储系统,支持复杂的数据结构(列表、哈希、集合)。PHP 有多个客户端可用:predis/predis(纯 PHP)和 ext-redis(C 扩展)。



通过 Composer 安装示例:

composer require predis/predis


使用 Redis 进行缓存的基本示例:

<?phprequire 'vendor/autoload.php';

use Predis\\Client;

$redis = new Client([ 'scheme' => 'tcp', 'host' => '127.0.0.1', 'port' => 6379,]);

$cacheKey = 'user_list_page_1';$ttl = 300; // 5 分钟

// 尝试从缓存获取数据if ($redis->exists($cacheKey)) { $data = unserialize($redis->get($cacheKey)); echo "数据来自缓存";} else { // 代价高昂的操作(例如 SQL 查询) $data = getUsersFromDatabase(1, 20); $redis->setex($cacheKey, $ttl, serialize($data)); echo "数据来自数据库";}

print_r($data);


Redis 的优点:速度快(毫秒级)、支持 TTL、原子操作、发布/订阅、磁盘持久化。缺点:需要单独的服务器,消耗内存。



2. Memcached — 简单与速度



Memcached 是另一个流行的内存存储系统,但不支持复杂的数据结构。在 PHP 中使用 memcached 扩展(注意字母 d — 这是较新的版本)。



安装扩展:

sudo apt install php-memcached


使用 Memcached 的示例:

<?php$memcached = new Memcached();$memcached->addServer('127.0.0.1', 11211);

$key = 'article_42';$data = $memcached->get($key);

if ($memcached->getResultCode() === Memcached::RES_NOTFOUND) { $data = fetchArticleFromDB(42); $memcached->set($key, $data, 3600); // 1 小时 echo "查询数据库";} else { echo "来自 Memcached 缓存";}


何时选择 Memcached:当您需要简单的字符串缓存,无需复杂数据结构,并且不想配置持久化时。Memcached 在简单的 get/set 操作上比 Redis 更快,但在功能上有所不足。



3. APCu — 直接在 PHP 中缓存



APCu(Alternative PHP Cache)是一个扩展,用于在当前 PHP 进程的共享内存中缓存数据。无需单独的

推荐