opcache(opcache control)

软件问答 2024.10.21 1

目录:

Windows 2008 下 PHP 开启 opcache 后频繁 500 错误解决方式

最近公司后台访问速度下降,操作卡顿,公司后台环境是 windows server 2008 + iis7 + php5.6,于是在参考网上解决方案后,觉得使用 opcache 最为方便,于是参考几篇配置示例文档后,在线部署了。经过一段时间体验后,发现确实快了很多,但是相应的出现了一个以前几乎没见过的问题,访问后台时经常性 500 错误,但是刷新页面就恢复正常了,将这个现象在网上搜了一番,确实存在这个问题,但是找了许多帖子也没有发现靠谱的解决方案,于是就搁置了这个问题,刷新页面重试也是可以忍受的。

后来,经公司运营反馈发现,500 错误发生的太频繁了,另外有时候刷新也不管用,因为后台有些页面会一次性批量请求后端接口,然后几乎都是 500,这个问题就有些严重了,于是重新开始在网上寻求解决方式。

搜索到两个方案如下:

在 Internet 信息服务(IIS)管理器下的应用程序池中选择应用,右键-高级设置-标识,将 ApplicationPoolIdentity 修改为 LocalSystem,经验证,失败。

在 PHP 手册中有这么一个配置项

另外,在评论中有下面这段话,

大致意思是当我们在 windows 平台下开启 opcache 时,你可能发现运行时出现随机 500 错误,然后在 php.ini 中添加一行配置 opcache.mmap_base = 0x20000000 可以解决。不幸的是,我不知道值“0x20000000”的意义,我只能告诉你这个值可以解决这个问题。

经过验证,成功解决 500 错误!

下面贴下我自己的 opcache 配置

php性能加速之opcache

OPcache 是一个通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能的PHP扩展。 存储预编译字节码的好处就是 省去了每次加载和解析 PHP 脚本的开销。PHP 5.5.0 及后续版本中已经绑定了 OPcache 扩展。

首先,我们来先大致了解下http--nginx--php-fpm--php处理的流程机制

http request --- nginx(代理)---- php-fpm(master 进程,分配)---- php-fpm(worker处理 ) ----php-cgi(1.启动ZEND引擎,加载配置,载入module,2.初始化php脚本进行词法分析,语法分析,生成语法树,3.ZEND引擎编译语法树,生成可执行字节码。4.执行字节码,返回处理结果)

opcache 就缓存了php脚本预编译的字节码避免每次处理请求都重复执行(php-cgi处理的1,2,3)步骤,这样可以使得php性能大大提高。

php.ini

1.重启php-fpm

2.打印phpinfo(),看到有ZEND OPcache就证明已经开启成功了

怎样清除 opcache 缓存

opcache.enable 启用操作码缓存,默认为“1”

如果禁用此选项,则不会优化和缓存代码。 在运行期使用 ini_set() 函数只能禁用 opcache.enable 设置,不可以启用此设置。 如果在脚本中尝试启用此设置项会产生警告。

opcache.enable_cli 仅针对 CLI 版本的 PHP 启用操作码缓存。

通常被用来测试和调试。

opcache.revalidate_freq=0 检查脚本时间戳是否有更新的周期,以秒为单位。

设置为 0 会导致针对每个请求, OPcache 都会检查脚本更新。

opcache.validate_timestamps=0 如果启用,那么 OPcache 会每隔 opcache.revalidate_freq 设定的秒数 检查脚本是否更新。

如果禁用此选项,你必须使用 opcache_reset() 或者 opcache_invalidate() 函数来手动重置 OPcache,也可以 通过重启 Web 服务器来使文件系统更改生效。

本文转载自互联网,如有侵权,联系删除

相关推荐