PHP Opcode 的缓存技术

澳门新葡亰娱乐在线 2

【编者按】此前,阅读过了很多关于 PHP
性能分析的文章,不过写的都是一条一条的规则,而且,这些规则并没有上下文,也没有明确的实验来体现出这些规则的优势,同时讨论的也侧重于一些语法要点。本文就改变 PHP
性能分析的角度,并通过实例来分析出 PHP 的性能方面需要注意和改进的点。

一、Opcode

Opcode 全称 Operation
Code,意为操作码,解释器执行PHP脚本时会解析代码,生成Zend引擎可以直接运行的中间代码,即Opcode。

PHP脚本执行的顺序有四个步骤:

  1. Scanning:扫描,将PHP代码转换为语言片段(Tokens),词法分析。
  2. Parsing:解析,将片段转换成简单而有意义的表达式,语法分析。
  3. Compilation:编译,将表达式编译成Opcode。
  4. Execution:依次执行Opcode。

每次运行一个脚本,PHP都要执行以上的步骤,如果脚本内容没有变化则编译过程会被重复执行,这样就会消耗很多资源。如果Opcode可以被缓存,自然性能就会提升,Opcode缓存技术就出现了。

使用Opcode缓存后,当运行一个PHP脚本时(除了第一次、缓存过期和强制刷新),不在读取、解析和编译PHP代码。PHP解释器会从内存中读取预先编译好的Opcode,立即执行。这样就能节省很多时间,极大提升应用的性能。

Opcode缓存的工具有很多,例如Zend
Opcache(下文简称Opcache)、APC、eAccelerator、XCache等。因为Opcache在PHP5.5中集成,所以目前使用最多的就是Opcache,本文也仅讨论Opcache。

澳门新葡亰娱乐在线 1

二、Opcache

Opcache最开始叫做Zend
Optimizer,是Zend做的免费Opcode缓存工具,PHP5.5以后这个工具改名为Zend
Opcache,并且内置在PHP核心中。

Opcache并不仅仅是一个Opcode的缓存工具,他还对Opcode进行了优化,使得你的代码效率更高。鸟哥的《一个关于Zend
O+的小分享》介绍了Opcache如何做的优化。

有了Opcache以后,PHP脚本执行的顺序变为下图:

澳门新葡亰娱乐在线 2

对 PHP
性能的分析,我们从两个层面着手,把这篇文章也分成了两个部分,一个是宏观层面,所谓宏观层面,就是
PHP
语言本身和环境层面,一个是应用层面,就是语法和使用规则的层面,不过不仅探讨规则,更辅助以示例的分析。

三、Opcache 启用和配置

Zend
Opcache虽然被内置,但默认并没有启用,启用必须在php.ini的文件中指定Zend
Opcache的扩展库的所在路径,并打开配置项。例如:

zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128      //共享内存大小, 这个根据你们的需求可调
opcache.interned_strings_buffer=8   //interned string的内存大小, 也可调
opcache.max_accelerated_files=4000  //最大缓存的文件数目
opcache.validate_timestamps=1
opcache.revalidate_freq=60          //60s检查一次文件更新
opcache.fast_shutdown=1             //打开快速关闭, 打开这个在PHP Request Shutdown的时候回收内存的速度会提高
opcache.save_comments=0             //不保存文件/函数的注释

 

  • opcache.interned_strings_buffer=8,此选项用来调整存储驻留字符串的内存量,单位M。默认情况下,PHP驻留的字符串会在各个PHP进程中隔离,该选项能够让PHP-FPM进程池中的所有进程共享字符串存储,从而节省更多内存。
  • opcache.max_澳门新葡亰娱乐在线,accelerated_files=4000,注意此选项一定要比应用中的PHP脚本文件数量大。
  • opcache.validate_timestamps=1,是否开启自动检查脚本被更新,时间间隔由opcache.revalidate_freq设置,单位秒,建议在开发环境中设置为1,生产环境中配置为0(需手动清除旧Opcode缓存)。如果此值为1,opcache.revalidate_freq为0,则会在每次请求时重新验证PHP文件,适用于开发环境。
  • opcache.fast_shutdown=1,这个设置能够让opcode更快的退出,把对象析构和内存释放交给Zend引擎的内存管理器来完成。

 

转载自:

宏观层面,也就是对 PHP 语言本身的性能分析又分为三个方面:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章

网站地图xml地图