资讯专栏INFORMATION COLUMN

【modernPHP专题(13)】ZendOpcache字节码缓存

KevinYan / 702人阅读

摘要:概述字节码缓存不是的新特性,有很多独立的扩展可以实现,比如和等,但是截至目前这些扩展都没有集成到内核,从开始,内置了字节码缓存功能,名为。开始之前,我们先来看看什么是字节码缓存,以及字节码缓存的作用是什么。该函数将重置整个字节码缓存。

概述

字节码缓存不是PHP的新特性,有很多独立的扩展可以实现,比如APC、eAccelerator和Xache等,但是截至目前这些扩展都没有集成到PHP内核,从PHP 5.5.0开始,PHP内置了字节码缓存功能,名为Zend Opcache。

开始之前,我们先来看看什么是字节码缓存,以及字节码缓存的作用是什么。

众所周知,PHP是解释型语言,构建在Zend 虚拟机之上,PHP解释器在执行PHP脚本时会解析PHP脚本代码,把PHP代码编译成一系列Zend操作码( opcode,由于每个操作码都是一个字节长,所以又叫字节码,字节码可以直接被Zend虚拟机执行),然后执行字节码。每次请求PHP文件都是这样,这会消耗很多资源,如果每次HTTP请求都必须不断解析、编译和执行PHP脚本,消耗的资源更多。如果PHP源码不变,相应的字节码也不会变化,显然没有必要每次都重新生成Opcode,结合在Web应用中无处不在的缓存机制,我们可以把首次生成的Opcode缓存起来,这样下次直接从缓存取,岂不是很快?下面是启用Opcode缓存之前和之后的流程图:

字节码缓存能存储预先编译好的PHP字节码,这样,下次请求PHP脚本时,PHP解释器不用每次读取、解析和编译PHP代码,直接从内存中读取预先编译好的字节码,然后立即执行,这样能省很多时间,极大提升应用的性能。

启用Zend Opcache
注:如果使用Windows开发环境,或者使用brew或apt-get等命令安装的PHP可以略过编译步骤。

默认情况下,Zend Opcache没有开启,需要我们在编译时使用--enable-opcache指定启用Zend Opcache。

编译好PHP后还需要在php.ini中指定Opcache扩展路径:

zend_extension=/path/to/opcache.so

一般而言PHP编译成功后会显示Zend Opcache扩展路径,但如果想不起来,可以使用如下命令找到PHP扩展所在目录:

php -ini | grep extensions
[info] 注:如果你使用Xdebug,需要在php.ini中先加载Zend Opcache,再加载Xdebug。

重启后,查看phpinfo

php -info | grep Opcache

配置Zend Opcache

启用Zend Opcache后还需要在php.ini中配置Zend Opcache,下面是一份配置示例作为参考:

opcache.validate_timestamps=1    // 生产环境中配置为0
opcache.revalidate_freq=0    //检查脚本时间戳是否有更新时间
opcache.memory_consumption=64    //Opcache的共享内存大小,以M为单位
opcache.interned_strings_buffer=16    //用来存储临时字符串的内存大小,以M为单位
opcache.max_accelerated_files=4000    //Opcache哈希表可以存储的脚本文件数量上限
opcache.fast_shutdown=1         //使用快速停止续发事件

官网配置参考
使用Zend Opcache

Zend Opcache使用起来很简单,因为启用之后它会自动运行,Zend Opcache会自动在内存中缓存预先编译好的PHP字节码,如果缓存了某个文件的字节码,就执行对应的字节码。

如果php.ini中配置了opcache.validate_timestamps值为0,需要小心,因为Zend Opcache将不能觉察PHP脚本的变化,必须手动清空Zend OPcache缓存的字节码,才能让它发现PHP文件的变动。这个配置适合在生产环境中设置为0,但在开发环境会带来不便,我们可以在开发环境中这样配置启用自动验证缓存功能:

opcache.enable=1 # 启用操作码缓存,默认为“1”, 如果禁用此选项,则不会优化和缓存代码。
opcache.revalidate_freq=0 #  检查脚本时间戳是否有更新的周期,以秒为单位。设置为 0 会导致针对每个请求, OPcache 都会检查脚本更新。
opcache.validate_timestamps=1 # 如果启用,那么 OPcache 会每隔 opcache.revalidate_freq 设定的秒数 检查脚本是否更新。

手动清理缓存

除了重启php-fpm的进程可以清理opcache缓存外,
手动清理缓存涉及到的opcache函数主要为:opcache_reset()和opcache_invalidate() 。

boolean opcache_reset ( void ) # 该函数将重置整个字节码缓存。 在调用 opcache_reset() 之后,所有的脚本将会重新载入并且在下次被点击的时候重新解析。

[warning] 需要注意的是,当PHP以PHP-FPM的方式运行的时候,opcache的缓存是无法通过php命令进行清除的,只能通过http或cgi到php-fpm进程的方式来清除缓存。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/31470.html

相关文章

  • modernPHP专题(10)】理解output buffer

    摘要:磁盘高速缓存操作系统中使用磁盘高速缓存技术来提高磁盘的速度,对高速缓存复制的访问要比原始数据访问更为高效。因此,磁盘高速缓存在逻辑上属于磁盘,物理上则是驻留在内存中的盘块。 1. 磁盘高速缓存(Disk Cache) 操作系统中使用磁盘高速缓存技术来提高磁盘的I/O速度,对高速缓存复制的访问要比原始数据访问更为高效。例如,正在运行的进程的指令既存储在磁盘上,也存储在物理内存上,也被复...

    kelvinlee 评论0 收藏0
  • php系列框架的加速器Opcache

    摘要:什么是当解释器完成对脚本代码的分析后,便将它们生成可以直接运行的中间代码,也称为操作码,。的目地是避免重复编译,减少和内存开销。这将带来显着的性能加速,通常特别是高流量和高并发量时降低了整体服务器的内存消耗,而且很少有缺点。 一、个人实践发现opcache 最近为了应对双十一期间高流量的冲击,小编通过压力测试去查找服务器性能瓶颈,发现100并发时,QPS并不是很高,但CPU和内存消耗特...

    lauren_liuling 评论0 收藏0
  • modernPHP专题(14)】内置的http服务器

    摘要:起就在中内置了服务器但只是提供开发测试使用,不推荐使用中生产环境中。因为这个服务器接受处理请求时顺序执行的,不能并发处理。这个内置的服务器使用起来非常的方便,你只需要执行下面的命令启动服务器然后就可以访问了。 PHP 5.4起就在CLI SAPI中内置了web服务器,但只是提供开发测试使用,不推荐使用中生产环境中。因为这个服务器接受处理请求时顺序执行的,不能并发处理。 这个内置的web...

    RancherLabs 评论0 收藏0
  • modernPHP专题(12)】魔术方法小结

    说明 魔术方法就是在特定场景下不需要调用而自动执行的方法。因为有魔术方法,所以我们的类可以写得很灵活~ __construct #构造方法,在类被实例化时自动调用,一般用于初始化操作; __destruct #析构方法,对象被销毁时自动调用; __clone() #克隆方法,当对象被克隆时,将会自动调用 __get($key) #属性获取...

    hearaway 评论0 收藏0
  • modernPHP专题(1)】php7常用特性整理

    摘要:它使得在生产环境中启用断言为零成本,并且提供当断言失败时抛出特定异常的能力。错误和异常改变了大多数错误的报告方式。不同于传统的错误报告机制,现在大多数错误被作为异常抛出。 PHP7性能 7最大的亮点,应该就是性能提高了两倍,某些测试环境下甚至提高到三到五倍,具体可以了解以下链接: PHP7 VS HHVM (WordPress) HHVM vs PHP 7 – The Competit...

    Render 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<