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

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

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

开始课程

引言:为什么缓存是PHP性能的基础

\n\n

每位PHP开发者迟早都会遇到性能问题。页面加载缓慢、服务器内存消耗过高以及频繁的数据库查询——这些都是缺乏合理缓存的症状。在现代Web开发中,缓存不是奢侈品,而是必需品。没有它,即使是最优化的代码在高负载下也会变慢。

\n\n

在本文中,我们将探讨PHP中三种关键的缓存方法:Redis、Memcached和内置解决方案(APCu、OPcache、文件缓存)。您将学习如何为特定任务选择合适的工具,看到可运行的代码示例,并获得实用的实施建议。

\n\n

1. PHP内置解决方案:APCu、OPcache和文件缓存

\n\n

1.1. OPcache——字节码缓存

\n\n

OPcache是PHP内置的一种机制,用于编译并将编译后的脚本字节码保存在内存中。OPcache不会每次都解析和编译PHP文件,而是使用现成的结果。这可以在不编写一行代码的情况下带来30-50%的速度提升。

\n\n

php.ini中的配置:

\n
opcache.enable=1\nopcache.memory_consumption=128\nopcache.interned_strings_buffer=8\nopcache.max_accelerated_files=10000\nopcache.revalidate_freq=2
\n\n

要检查OPcache的工作情况,请使用以下函数:

\n
<?php\nvar_dump(opcache_get_status());\n?>
\n\n

1.2. APCu——内存中的数据缓存

\n\n

APCu(Alternative PHP Cache)是一个用于在共享内存中存储任意数据的扩展。它非常适合缓存繁重计算的结果、配置或很少更改的数据。

\n\n

使用APCu进行缓存的示例:

\n
<?php\n// 将数据保存到缓存中,持续3600秒(1小时)\n$data = ['users' => 1500, 'status' => 'active'];\napcu_store('app_stats', $data, 3600);\n\n// 从缓存中读取\n$cached = apcu_fetch('app_stats');\nif ($cached === false) {\n    // 缓存中没有数据——重新计算\n    $cached = computeExpensiveData();\n    apcu_store('app_stats', $cached, 3600);\n}\n?>
\n\n

1.3. 文件缓存——无需额外扩展的简单入门

\n\n

如果无法安装Redis或Memcached,可以使用文件系统。虽然速度较慢,但可以在任何主机上运行。

\n\n
<?php\nclass FileCache {\n    private $cacheDir;\n    \n    public function __construct($dir = '/tmp/php_cache/') {\n        $this->cacheDir = $dir;\n        if (!is_dir($dir)) {\n            mkdir($dir, 0777, true);\n        }\n    }\n    \n    public function get($key, $ttl = 3600) {\n        $file = $this->cacheDir . md5($key) . '.cache';\n        if (!file_exists($file)) return null;\n        \n        if (time() - filemtime($file) > $ttl) {\n            unlink($file);\n            return null;\n        }\n        \n        return unserialize(file_get_contents($file));\n    }\n    \n    public function set($key, $data) {\n        $file = $this->cacheDir . md5($key) . '.cache';\n        file_put_contents($file, serialize($data));\n    }\n}\n\n// 使用示例\n$cache = new FileCache();\n$result = $cache->get('expensive_query');\nif ($result === null) {\n    $result = $db->query('SELECT ...');\n    $cache->set('expensive_query', $result);\n}\n?>
\n\n

2. Memcached——面向高负载的分布式缓存

\n\n

2.1. 什么是Memcached以及何时使用它

\n\n

Memcached是一个基于内存的分布式缓存系统。它采用key-value模式运行,非常适合缓存SQL查询结果、用户会话和HTML片段。主要优势包括:

\n
    \n
  • 安装和配置简单
  • \n
  • 高速度

博客

书籍推荐