PHP中的缓存:Redis、Memcached及内置解决方案

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

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

开始课程

PHP中的缓存:Redis、Memcached 及内置方案——加速Web应用



每位PHP开发者都会面临性能问题:数据库响应缓慢、页面加载时间长、服务器在高负载下不堪重负。解决这些问题的关键在于合理使用缓存。本文将分析PHP中三种主要的缓存方案:内置机制(APCu、OpCache)、外部服务器Memcached和Redis。您将了解何时选择哪种工具,并获取可直接使用的代码实现示例。



1. 内置方案:OpCache 与 APCu



我们从最简单的开始讲起——PHP引擎级别的缓存。这里有两个核心组件。



1.1. OpCache(PHP操作码缓存)

OpCache自PHP 5.5版本起内置。它会缓存PHP脚本编译后的字节码(操作码)。如果没有它,每次请求都需要重新解析和编译源代码——这是资源的浪费。启用OpCache无需编写一行代码即可获得30-50%的速度提升。

php.ini配置:

opcache.enable=1opcache.memory_consumption=128opcache.max_accelerated_files=4000opcache.revalidate_freq=60


1.2. APCu(替代PHP用户缓存)

APCu是用于用户数据(变量、计算结果)的缓存。它运行在RAM中,非常适合存储小尺寸、频繁请求的数据:配置、翻译、简单SQL查询的结果。

APCu使用示例:

<?php// 将数据保存到缓存,有效期300秒apcu_store('site_config', $config, 300);

// 从缓存获取数据$cached = apcu_fetch('site_config');if ($cached === false) { // 未找到数据——加载并保存 $cached = loadConfigFromDB(); apcu_store('site_config', $cached, 300);}

// 删除键apcu_delete('site_config');?>

优点:无需外部服务,易于配置,延迟极低。 缺点:仅适用于单台服务器,PHP-FPM重启时数据会丢失。



2. Memcached——适用于简单数据的分布式缓存



Memcached是一个高性能的分布式内存缓存系统。它非常适合存储简单的键值对和会话。与APCu不同,Memcached作为独立服务器运行,可以在多台Web服务器之间共享。



安装扩展: pecl install memcached

连接与操作示例:

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

// 设置缓存,TTL(生存时间)为600秒$memcached->set('user_123_profile', $profileData, 600);

// 获取$profile = $memcached->get('user_123_profile');if ($memcached->getResultCode() === Memcached::RES_NOTFOUND) { // 缓存未命中——从数据库加载 $profile = getUserProfileFromDB(123); $memcached->set('user_123_profile', $profile, 600);}

// 会话缓存(在php.ini中配置)// session.save_handler = memcached// session.save_path = "localhost:11211"?>

何时使用Memcached:

  • 缓存SQL查询结果(产品列表、分类)
  • 在分布式环境中存储用户会话
  • 缓存HTML片段(例如菜单或页脚)

局限性:没有内置数据结构(仅支持字符串),最大值大小为1MB(可增加),不支持持久化——服务器重启时缓存会被清空。



3. Redis——支持数据结构的进阶缓存



Redis不仅是一个缓存,更是一个完整的内存数据存储系统,支持复杂类型:列表、集合、哈希、有序集合。它支持持久化(保存到磁盘),

博客

书籍推荐