xampp中opcache默认存在但禁用,必须修改php\php.ini(非apache\bin\php.ini)启用opcache.enable=1、正确配置zend_extension绝对路径、调优关键参数,并重启apache后通过phpinfo()和opcache_get_status()在web上下文中验证生效。

OPcache 在 XAMPP 中默认存在但禁用,不改 php.ini 就永远不生效——改错文件、漏关键参数、不重启 Apache 是三大高频失败原因。
确认你改的是 Apache 实际加载的 php.ini
XAMPP 的 Apache 不读 apache\bin\php.ini,它只认 php\php.ini(路径形如 C:\xampp\php\php.ini)。很多人在错误位置修改后刷 phpinfo() 看到 OPcache 区块就以为成功了,其实只是模块“存在”,但 Web 进程根本没加载它。
- 访问
http://localhost/dashboard/phpinfo.php,搜索 “Loaded Configuration File”,复制显示的完整路径,确保你编辑的就是这个文件 - 在该文件中搜索
opcache.enable,如果找不到,说明还没启用;如果找到的是;opcache.enable=0,去掉分号并改为opcache.enable=1 - 别信
php -m | findstr opcache的输出——那是 CLI 模式的结果,和网页请求无关
必须写对 zend_extension 路径(Windows 下最常卡死)
XAMPP 默认配置里常写 zend_extension=php_opcache.dll,但 PHP 找不到这个文件,因为没给绝对路径,或 DLL 根本不在当前工作目录下。结果是静默失败:phpinfo() 有 OPcache 区块,但 opcache_get_status() 报 Call to undefined function。
- 打开
php\php.ini,找到zend_extension行,改成绝对路径,例如:zend_extension="C:\xampp\php\ext\php_opcache.dll" - 确保该路径下真实存在
php_opcache.dll文件(检查php\ext\目录) - 不要写成
extension=opcache.so或extension=php_opcache.dll——必须是zend_extension,否则无效
关键参数不能只开 enable=1
只设 opcache.enable=1 会导致缓存池极小、频繁淘汰,实际命中率可能低于 30%,反而增加 CPU 开销。XAMPP 默认的 max_accelerated_files=2000 对含 Composer vendor 的项目完全不够用。
-
opcache.memory_consumption=128(单位 MB;WordPress 或 Laravel 建议 ≥256) -
opcache.max_accelerated_files=4000(小项目够用;中大型项目建议 ≥10000;可用dir /s /b *.php | find /c ":"估算项目 PHP 文件总数) -
opcache.validate_timestamps=1(开发阶段必须为 1,否则改完代码刷新页面仍是旧逻辑) -
opcache.revalidate_freq=2(开发时设为 2 秒,平衡响应速度与更新及时性)
重启 Apache 后必须验证 Web SAPI 是否真加载
点 XAMPP 控制面板的 “Restart” 是必要但不充分操作——如果配置有语法错误(比如路径含中文、DLL 不存在),Apache 可能启动失败但面板仍显示 “Started”。这时 OPcache 实际未加载。
- 重启后立即访问
http://localhost/dashboard/phpinfo.php,搜索 “Opcode Caching”,确认状态是Enabled,且opcache.enabled显示On - 新建一个
opcache-test.php,内容为<?php print_r(opcache_get_status()); ?>,通过浏览器访问;若报函数未定义,说明扩展没进 Web 进程 - 终端执行
php -r "echo ini_get('opcache.enable');"输出1仅表示 CLI 生效;Web 是否生效,只看浏览器里能否调用opcache_get_status()
最容易被忽略的是:XAMPP 的 Apache 和 CLI 使用两套独立配置,且 OPcache 必须由 zend_extension 加载而非普通 extension;一旦路径写错或参数缺失,它不会报错,只会沉默失效——所以验证一定得在 Web 请求上下文中做,不能只信命令行输出。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











