OPcache 在 XAMPP 中默认内置但禁用,需修改 php\php.ini 启用 opcache.enable=1、指定 zend_extension="C:\xampp\php\ext\php_opcache.dll" 并调优关键参数,重启 Apache 后通过 phpinfo() 和 opcache_get_status() 验证 Web SAPI 下真实生效。

OPcache 在 XAMPP 中默认存在但禁用,不改配置、不重启 Apache 就永远不生效——你看到 phpinfo() 里有 OPcache 区块,不代表它真在跑。
确认你改的是 Web 模式真正加载的 php.ini
XAMPP 的 Apache 不读 apache\bin\php.ini,它用的是 php\php.ini(路径形如 C:\xampp\php\php.ini)。很多人改错文件,改完刷 phpinfo() 还是显示 opcache.enable => Off。
- 访问
http://localhost/dashboard/phpinfo.php,搜索 “Loaded Configuration File”,记下完整路径 - 用记事本或 VS Code 打开这个文件,别用系统自带的“记事本”(可能乱码),确保编码为 UTF-8 无 BOM
- 搜索
opcache,确认你操作的是这个文件里的配置段,不是 CLI 或其他环境的 ini
必须写对 zend_extension 路径,否则静默失败
Windows 下 zend_extension=php_opcache.dll 这种写法极大概率失效——PHP 找不到 DLL 文件。XAMPP 默认没配绝对路径,而当前工作目录不确定,导致扩展加载失败,opcache_get_status() 直接报函数不存在。
- 打开
php\php.ini,找到或添加这一行:zend_extension="C:\xampp\php\ext\php_opcache.dll" - 路径必须用双引号包裹,且指向真实存在的文件(检查
php\ext\目录下是否有php_opcache.dll) - 绝不能写成
extension=opcache.so或extension=php_opcache.dll—— OPcache 是 Zend 扩展,必须用zend_extension
关键参数不设全,等于白开
只设 opcache.enable=1 不够。XAMPP 默认 opcache.max_accelerated_files=2000,一个 Laravel 项目 vendor 里就超 1.5 万 PHP 文件,缓存池一满就疯狂踢旧脚本,命中率掉到 30% 以下,反而拖慢请求。
立即学习“PHP免费学习笔记(深入)”;
-
opcache.enable=1(必须,CLI 和 Web 都要设) -
opcache.memory_consumption=256(单位 MB;小项目 128 够,WordPress/Laravel 建议 ≥256) -
opcache.max_accelerated_files=20000(用dir /s /b *.php | find /c ":"粗略估算项目总文件数) -
opcache.validate_timestamps=1(开发阶段务必为 1,否则改代码刷新页面还是旧逻辑) -
opcache.revalidate_freq=2(开发时设 2 秒,平衡响应与更新及时性)
重启 Apache 后必须验证 Web SAPI 是否真加载
改完配置点“Start” Apache 不代表生效:如果 Apache 启动失败(比如 DLL 路径错、ini 语法错),控制面板仍可能显示“Started”,但实际 PHP 进程根本没起来。
- 重启后立刻访问
http://localhost/dashboard/phpinfo.php,搜索 “Opcode Caching”,状态必须是 Enabled - 新建一个
test-opcache.php,内容为:<?php print_r(opcache_get_status()); ?>,访问该地址不报错且输出数组才真正可用 - 命令行执行
php -r "echo opcache_enabled() ? 'yes' : 'no';"只验证 CLI;Web 是否生效,只看浏览器里能不能调opcache_get_status()
最容易被忽略的是:XAMPP 的 Apache 和 CLI 使用两套独立的 PHP 配置和进程模型,php -m | findstr opcache 成功 ≠ 网页请求走 OPcache。一切以 Web 环境下的 opcache_get_status() 调用结果为准。



















