深入解析Opcache工作原理:提升PHP性能的关键技术
学习和交流:

点击获取:Jetbrains家庭桶激活代码,接收优惠券和下订单为0.1 yuan
从Opcache的字面意义来看,它必须被缓存。但是您知道它是如何工作的吗?在这里,我们会让您一点一点地知道!
在PHP项目中,尤其是在较高并发和流量高的情况下,如何改善PHP响应时间是一项非常重要的任务。
Opcache是优化PHP性能的必不可少的组件,尤其是在使用PHP框架的项目中,其作用更加明显。
1个概述
在了解OPCACHE函数之前,有必要了解PHP-FPM + NGINX的工作机制,以及PHP脚本解释和执行的机制。
1.1 PHP-FPM + NGINX的工作机制
Web浏览器到NGINX的请求完成了PHP处理,总共有五个步骤:
步骤1:开始服务
1开始php-fpm。 PHP-FPM支持两种通信模式:TCP插座和UNIX插座;
2 PHP-FPM将启动两种类型的过程:主过程和工作过程。前者负责监视端口,分配任务和管理工作流程;后者是PHP的CGI程序,该程序负责解释,编译和执行PHP脚本。
3启动nginx。首先,将加载NGX_HTTP_FASTCGI_MODULE模块,将初始化FASTCGI执行环境,并将实现FastCGI协议请求代理。
4请注意:FastCGI的工作过程(CGI过程)由PHP-FPM而不是NGINX管理。 nginx只是代理
步骤2:请求=> nginx
1 NGINX接收请求,并根据位置配置选择合适的处理程序
2这是代理PHP的处理程序
步骤3:nginx => php-fpm
1 NGINX将请求转换为FastCGI请求
2通过TCP插座/UNIX插座发送到PHP-FPM的主过程
步骤4:PHP-FPM Master => Worker
1 php-fpm主流程接收请求
2分配工作过程以执行PHP脚本。如果没有免费工人,请返回502错误
3个工人(PHP-CGI)流程执行PHP脚本,如果超时,返回504错误
4处理完成,返回结果
步骤5:php-fpm worker => master => nginx
1 PHP-FPM工作过程返回处理结果,关闭连接并等待下一个请求
2 PHP-FPM主过程通过插座返回处理结果
3 NGINX处理程序订单将每个响应缓冲区发送到第一个过滤器→第二个→→等等→最终响应发送给客户
1.2 PHP脚本解释和执行机制
在了解PHP + NGINX的整体处理过程之后,让我们看一下PHP脚本的特定执行过程。首先,让我们看一个例子:
if (!empty($_POST)) {
echo "Response Body POST: ", json_encode($_POST), "\n";
}
if (!empty($_GET)) {
echo "Response Body GET: ", json_encode($_GET), "\n";
}
让我们分析执行过程:
1.PHP初始化执行步骤,启动Zend Engine并加载注册的扩展模块
2。初始化后读取脚本文件,Zend Engine执行词汇分析(LEX),语法分析(Bison),并生成语法树。
3.Zend Engine编译语法树并生成OpCode。
4。Zend Engine执行OpCode并返回执行结果
在PHP CLI模式下,每次执行PHP脚本时,四个步骤都将一一执行;
在PHP-FPM模式下,步骤1)在启动PHP-FPM时执行一次,并且在后续请求中不再执行;步骤2)〜4)每个请求必须执行一次;
实际上,步骤2)和3)与同一PHP脚本每次运行的结果相同的结果。
在PHP-FPM模式下,必须处理每个请求,这是系统资源的巨大浪费。那么有没有办法优化它?
当然,有:
2。opcache简介
OPCACHE是由Zend生产的开放式OPCODE缓存扩展名,并且还具有代码优化功能,每次都会保存加载和解析PHP脚本的开销。 OPCACHE扩展已绑定到PHP 5.5.0和后续版本。
缓存两种类型的内容:
3。opcache原理
OPCACHE CACHE的主要机制是将编译的OPCODE放入共享内存中,并将其提供给其他进程以供访问。
这涉及内存共享机制,此外,所有内存资源操作都有锁,我们将一一解释它们。
3.1共享内存
UNIX/Linux系统提供了多种方式来共享过程之间的内存:
1.System-V SHM API:系统V共享内存,
SYSV SHM是持久的,除非被一个过程明确删除,否则它始终存在于内存中,直到系统关闭为止。
2.mmap API:
当然,还有另一个优点,它不需要频繁的读/写系统调用
3.POSIX API:System V的共享内存已过时,POSIX共享内存提供了更易于使用和更合理设计的API。
4.UNIX插座API
OPCACHE根据配置或默认的MMAP内存共享模式使用前三个共享存储机制。
根据PHP字节码缓存方案,OPCACHE的内存管理设计非常简单,并具有快速读取,不会释放内存,并且已将过期的数据设置为浪费。
当浪费的内存大于设定值时,将自动重新启动,清除和再生缓存。
3.2静音
任何内存资源操作都涉及锁定机制。
共享内存:在一个单位的一个单位内只能执行写入操作,并且允许多个进程执行读取操作;
同时,读取操作没有被阻止,因此很少有锁定案例。
这引发了另一个问题:新代码,大型流量方案,处理排队以执行缓存操作操作;重复写作导致浪费资源。
4。opcache缓存的解释
Opcache是官方的OpCode缓存解决方案。在PHP5.5版本之后,它已将其包装到PHP源代码中并一起发布。
它将PHP汇编生成的字节码和数据缓存到共享内存中。根据每个请求,直接从缓存中读取编译的OpCode并执行。
通过保存脚本汇编过程,提高了PHP的运行效率。
如果您使用的是APC扩展并执行相同的工作,则强烈建议使用OPCACHE,尤其是在PHP7中。
4.1 opcode缓存
OPCACHE将缓存OpCode和以下内容:
4.2实施字符串缓存
首先,我们需要了解什么是实习字符串?
在PHP5.4中,引入了实施的弦乐机制,以优化PHP的存储和处理字符串。尤其是在处理诸如PHP文档之类的大块字符串时,实习字符串可以优化内存。
实施字符串缓存的内容包括:可变名称,类名称,方法名称,字符串,注释等。
在PHP-FPM模式下,实施的字符串缓存字符仅限于工作过程。缓存到OPCACHE中,然后可以在工作过程之间使用实施字符串缓存的字符串来保存内存。
我们需要注意的一件事是,在PHP开发中,通常会有大量评论也将被缓存到Opcache中。您可以通过php.ini配置关闭评论的缓存。但是,在诸如Zend Framework之类的框架中,将引用评论,因此是否要关闭评论的缓存需要以不同的方式处理。
5。opcache更新策略
它是缓存,都已经过期并更新策略。 Opcache的更新策略非常简单。到期数据设置为浪费,达到设定值,清除缓存并重建缓存。
应该在这里注意:在高流量方案中,重建缓存是一项非常耗资的任务。 OPCACHE在创建缓存时不会阻止其他过程读取。这将导致大量过程反复创建新的缓存。因此,不要设置Opcache到期时间
每次发布新代码时,都会反复创建新的缓存。如何避免它?
不要在高峰时段发布代码,这是在任何情况下遵循的规则
代码加热,例如使用脚本批量php访问URL,或使用OPCACHE暴露的API,例如OPCACHE_COMPILE_FILE()进行编译缓存
6 Opcache配置6.1内存配置
opcache.preferred_memory_model =“ mmap” opcache首选内存模块。如果剩下空白,OPCACHE将选择适用的模块。通常,自动选择可以满足需求。可选值包括:MMAP,SHM,POSIX和WIN32。
opcache.memory_consumption = 64 opcache的共享存储器大小,在megabytes中,默认为64m
opcache.interned_strings_buffer = 4用于存储临时字符串的内存大小,在megabytes中,默认4M
opcache.max_wasted_percentage = 5浪费内存的上限,作为百分比。如果达到此上限,OPCACHE将生成重新启动重新安排事件。默认5
6.2允许缓存的文件的数量和大小
opcache.max_accelerated_files = 2000可以存储在opcache哈希表中的脚本文件的最大数量。真实值是大于或等于质量数集中的设定值{223、463、983、1979、3907、7963、16229、32531、65407、130987}。设置的最小值范围为200,最大值为PHP 5.5.6之前的100,000,而PHP 5.5.6,然后是1000,000。默认值2000
opcache.max_file_size = 0字节中的缓存文件大小的上限。设置为0表示所有文件均已缓存。默认值0
6.3评论相关的缓存
opcache.load_commentsboolean如果禁用,即使文件包含注释,也不会加载评论内容。此选项可以与opcache.save_comments一起使用,以启用按需加载评论内容。
opcache.fast_shutdown boolean如果启用了,则使用快速停止式延期事件。所谓的快速停止恢复事件是指依赖Zend Engine的内存管理模块一次释放请求变量的所有内存,而不是按顺序释放每个分配的内存块。
6.4级别2缓存配置
opcache.file_cache配置辅助缓存目录并启用辅助缓存。启用2级缓存可以改善SHM内存已满,服务器重新启动或重置SHM时的性能。默认值是一个空字符串“”,这意味着禁用基于文件的缓存。
OPCACHE.FILE_CACHE_ONLYBOOLEAN在共享内存中启用或禁用OPCODE缓存。
opcache.file_cache_consistency_checksboolean是否在加载文件缓存脚本时是否验证文件的校验和。
opcache.file_cache_fallbackboolean在Windows平台上,当无法将进程连接到共享内存时,使用了基于文件的缓存,即opcache.file_cache_only = 1。启用需要显示的文件缓存。
参考链接:
以上是本文的全部。我希望所有程序员都会努力提高他们的个人技能。最后,编辑提醒您:每天阅读5分钟,每天学习一点,并每天取得进步。