Wave Cache 是一个已停止维护的小众PHP文件缓存类库,仅支持简单页面片段序列化存储,不具备过期策略、分布式能力与数据完整性校验,无法替代OPcache或Redis。

Wave Cache 是什么,它真能替代 opcache 或 Redis?
Wave Cache 不是 PHP 官方缓存扩展,也不是 Composer 上主流的缓存库(比如 symfony/cache 或 laravel/framework 自带的缓存驱动)。它是一个小众、已基本停止维护的第三方 PHP 类库,核心逻辑是把页面片段序列化后写入文件,靠 file_get_contents + unserialize 读取。它不支持分布式、无过期策略、不校验数据完整性——所以别把它当 Redis 或 APCu 用,也别指望它扛住并发写。
怎么手动集成 Wave Cache 到普通 PHP 脚本(非框架)
如果你只是想在几个老项目里快速加个“输出缓存”,又不想动服务器配置,Wave Cache 的原始用法确实够轻:下载它的 wave_cache.php,require_once 后调用 start() 和 end() 包裹 HTML 片段即可。但注意三点:
-
start()必须在任何输出(包括空格、BOM、echo)之前调用,否则会触发Cannot modify header information - 缓存键默认由
$_SERVER['REQUEST_URI']生成,无法按用户角色、设备类型等条件细分;想自定义得改源码里的$this->cache_key赋值逻辑 - 缓存文件权限容易出问题:
cache/目录必须可写,且 PHP 进程用户(如www-data)要有执行权限,否则写入失败但无报错,页面照常渲染——你以为缓存生效了,其实根本没存进去
为什么用 ob_start() + 文件写入比直接抄 Wave Cache 更可控
Wave Cache 底层就是封装了 ob_start() 和 file_put_contents(),但它把错误处理和路径拼接写死了。自己写三行反而更稳:
if ($cache = file_get_contents(__DIR__ . '/cache/' . md5($_SERVER['REQUEST_URI']) . '.html')) {
echo $cache;
exit;
}
ob_start();
// ……你的 HTML 输出……
$content = ob_get_clean();
file_put_contents(__DIR__ . '/cache/' . md5($_SERVER['REQUEST_URI']) . '.html', $content);
这样做的好处是:你能加 is_readable() 判断、设 filemtime() 过期检查、用 flock() 避免并发写冲突——而 Wave Cache 全都没做。
立即学习“PHP免费学习笔记(深入)”;
想支持多种后端?别硬改 Wave Cache,换标准接口
Wave Cache 没实现 PSR-6 或 PSR-16,没法插拔式切换 Redis / APCu / File。真要多后端,直接上 symfony/cache,几行就搞定:
use Symfony\Component\Cache\Adapter\FilesystemAdapter;
use Symfony\Component\Cache\Adapter\RedisAdapter;
$cache = $_ENV['CACHE_DRIVER'] === 'redis'
? new RedisAdapter(Redis::connect('127.0.0.1', 6379))
: new FilesystemAdapter();
关键点在于:Wave Cache 的“多种后端”只是文档里写的假象,实际代码里只有一套文件写入逻辑;所有所谓“支持 Memcached”的分支都是未合并的 PR,没人维护。现在还去适配它,等于在修一台停产后十年的打印机的墨盒。
缓存逻辑本身不难,难的是失效时机和一致性。Wave Cache 连最基础的“更新数据库后删对应缓存”都没提供钩子——这点最容易被忽略,也是线上出脏数据的主因。



















