Linux 环境下 PHP 如何使用缓存:从 OPcache 到 Redis 的实用选型

阿澈
阿澈
发布时间:2026-08-23| 155人浏览过
原创

前言

PHP 在 Linux 上做缓存,问题往往不在“有没有缓存”,而在“缓存加在哪一层、该选哪一类方案”。这篇文章把 OPcache、Memcached、Redis、文件缓存和 APCu 分开说明配置、用法和适用边界,帮助你根据项目规模、分布式需求以及数据恢复要求,快速判断哪种方案更适合当前业务。

PHP 在 Linux 上做缓存并不只是“装个扩展就完事”。真正影响效果的,往往是你到底要解决哪一层性能问题:是减少 PHP 脚本重复编译,还是缓存数据库结果、会话数据这类业务数据,或者只是想给单机项目找一个实现成本更低的方案。

这篇文章把常见的几种 PHP 缓存方式拆开来看,包括 OPcache、Memcached、Redis、文件缓存和 APCu。你可以直接对照自己的部署形态、数据恢复需求和并发规模,判断哪种方案更合适,哪些组合可以一起用。

为什么要先分清 PHP 缓存的层次

在 PHP 场景里,“缓存”至少可以分成两类:

PHP 缓存层次与常见方案对应关系图
PHP 缓存分层示意把脚本级缓存和数据级缓存分开看,更容易理解。
  • 脚本级缓存:减少 PHP 文件重复读取和编译,比如 OPcache。
  • 数据级缓存:缓存查询结果、会话、计算结果等业务数据,比如 Memcached、Redis、APCu 或文件缓存。

这也是很多项目一开始容易混淆的地方。OPcache 解决的是 PHP 执行前的编译开销,不负责替你缓存业务数据;而 Redis、Memcached、APCu 这类方案,重点在于减少重复查询和重复计算。

如果只选一种,往往会顾此失彼。实际项目里,常见做法反而是组合使用:例如用 OPcache 负责脚本加速,再用 APCu 或 Redis 负责业务数据缓存。

OPcache:先解决 PHP 脚本重复编译的问题

OPcache 是 PHP 内置扩展,它会把 PHP 脚本编译后的字节码放进共享内存。这样同一个脚本再次被请求时,就不需要重新读取文件、重新编译,可以直接复用结果,减少文件系统和编译带来的开销。

启用方式通常是在 php.ini 中加入或调整下面这些配置:

[opcache]
zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60

这些参数没有统一的“标准答案”,需要结合服务器内存和项目规模来调。例如服务器内存比较紧张时,可以适当下调 opcache.memory_consumption;项目文件数量较多时,则要留意 opcache.max_accelerated_files 是否够用。

如果你的站点还没有启用任何缓存,OPcache 通常是最值得先做的一步,因为它不需要改业务代码,收益也最直接。

Memcached:适合做分布式内存缓存

Memcached 是经典的高性能分布式内存缓存系统,适合缓存数据库查询结果、会话数据等高频访问内容。它的思路很直接:把原本每次都要重新获取的数据先放进内存,下次优先读缓存。

在 PHP 中使用前,先安装扩展:

sudo apt-get install php-memcached

基本代码示例如下:

$memcached = new Memcached();
$memcached->addServer('localhost', 11211);
$key = 'my_cache_key';
$data = $memcached->get($key);
if ($data === false) {
    // 缓存没命中,从数据库或其他地方获取数据
    $data = 'some_data';
    // 存入缓存,设定过期时间3600秒(1小时)
    $memcached->set($key, $data, 3600);
}
echo $data;

这里的关键点有两个:

  • get() 先尝试读取缓存,未命中时再回源获取数据。
  • set() 写入缓存时设置 3600 秒过期时间,也就是 1 小时。

另外,addServer 可以添加多个节点,这也是它适合分布式部署的重要原因。如果你的业务已经不再是单机应用,或者缓存容量和横向扩展能力比较重要,Memcached 仍然是一个很稳妥的选择。

Redis:功能更全,也更适合需要恢复能力的场景

Redis 和 Memcached 一样,都可以作为内存缓存使用,但它支持更丰富的数据结构,适用范围也更广。除了缓存,它还能承担消息队列等任务,因此很多项目会把它当成更通用的基础组件。

在 PHP 里,先安装扩展:

sudo apt-get install php-redis

然后通过下面的方式连接并读写缓存:

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$key = 'my_cache_key';
$data = $redis->get($key);
if ($data === false) {
    $data = 'some_data';
    $redis->set($key, $data, 3600); // 过期时间1小时
}
echo $data;

从用法上看,这段代码和 Memcached 很接近:先查缓存,未命中再写回缓存。但两者的定位并不完全一样。文中提到的一个关键差异是,Redis 具备持久化特性,因此更适合那些希望在服务重启或异常后仍具备一定数据恢复能力的场景。

如果你除了缓存,还可能继续用到更复杂的数据结构或其他能力,那么直接选 Redis 往往更省后续演进成本。

单机项目还能怎么选:文件缓存和 APCu

文件缓存:实现简单,但要注意磁盘和并发

如果应用还停留在单机阶段,文件缓存依然是最省事的方案之一。直接用 PHP 的 file_put_contents() 和 file_get_contents(),把序列化后的数据写进文件,读取时再反序列化即可。

它的优点是实现门槛低,不依赖额外服务;缺点也很明显:文件并发控制更麻烦,磁盘 I/O 压力上来后,性能提升会比较有限。因此它更适合小项目、低复杂度场景,或者临时性的缓存需求。

APCu:本地内存缓存,延迟低但共享能力有限

APCu 可以理解为更轻量的本地用户数据缓存方案,不需要额外启动服务,直接把数据放在 PHP 侧内存里。

安装方式如下:

sudo pecl install apcu

然后在 php.ini 中加入:

extension=apcu.so

代码示例:

$key = 'my_cache_key';
$data = apcu_fetch($key);
if ($data === false) {
    $data = 'some_data';
    apcu_store($key, $data, 3600); // 缓存1小时
}
echo $data;

APCu 的优势在于延迟很低,因为数据就在当前 PHP 进程的内存里;但它的局限也要提前考虑:跨进程共享能力有限,而且 PHP 重启后数据会丢失。也就是说,它更适合单机、本地热点数据缓存,而不是承担跨节点共享缓存的角色。

怎么选方案:按项目规模和目标取舍

把几种方案放在一起看,选择思路会清楚很多:

Memcached、Redis、APCu 与文件缓存的适用场景对比图
缓存方案选型对比几种常见方案并不是互相替代,而是围绕分布式能力、持久化需求、部署复杂度和本地性能做取舍。
  • 如果目标是减少 PHP 脚本重复编译,先启用 OPcache。
  • 如果是大型应用、需要分布式支持,优先考虑 Memcached 或 Redis。
  • 如果是小型项目、单机部署,OPcache 配合 APCu 或文件缓存通常就够用。
  • 如果你在意数据恢复能力,Redis 会比 Memcached 更合适。
  • 如果你更看重实现简单、上线快,文件缓存仍然有现实价值。

PHP 缓存没有一套适用于所有场景的“银弹”方案。真正实用的做法,是先确认瓶颈在哪一层,再决定用单机缓存、内存缓存还是分布式缓存。选型时重点看四件事:性能、可用性、持久性和易用性。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。