PHP 在 Linux 上做缓存并不只是“装个扩展就完事”。真正影响效果的,往往是你到底要解决哪一层性能问题:是减少 PHP 脚本重复编译,还是缓存数据库结果、会话数据这类业务数据,或者只是想给单机项目找一个实现成本更低的方案。
这篇文章把常见的几种 PHP 缓存方式拆开来看,包括 OPcache、Memcached、Redis、文件缓存和 APCu。你可以直接对照自己的部署形态、数据恢复需求和并发规模,判断哪种方案更合适,哪些组合可以一起用。
为什么要先分清 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 重启后数据会丢失。也就是说,它更适合单机、本地热点数据缓存,而不是承担跨节点共享缓存的角色。
怎么选方案:按项目规模和目标取舍
把几种方案放在一起看,选择思路会清楚很多:

- 如果目标是减少 PHP 脚本重复编译,先启用
OPcache。 - 如果是大型应用、需要分布式支持,优先考虑
Memcached或Redis。 - 如果是小型项目、单机部署,
OPcache配合APCu或文件缓存通常就够用。 - 如果你在意数据恢复能力,
Redis会比Memcached更合适。 - 如果你更看重实现简单、上线快,文件缓存仍然有现实价值。
PHP 缓存没有一套适用于所有场景的“银弹”方案。真正实用的做法,是先确认瓶颈在哪一层,再决定用单机缓存、内存缓存还是分布式缓存。选型时重点看四件事:性能、可用性、持久性和易用性。













