首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

再谈opcache

在介绍opcache之前,咱先了解一下程序的编译或解释原理;我们知道,如果是编译型语言,程序在执行前,编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快;如果是解释性语言,解释器则会在执行程序时,才将源码逐条解释成中间码给计算机来执行,所以运行速度是不如编译后的程序运行的快的。解释型语言的实现中,翻译器并不产生目标机器代码,而是产生易于执行的中间代码,这种中间代码与机器代码是不同的,中间代码的解释是由软件支持的,不能直接使用硬件,软件解释器通常会导致执行效率较低。用解释型语言编写的程序是由另一个可以理解中间代码的解释程序执行的。与编译程序不同的是,解释程序的任务是逐一将源程序的语句解释成可执行的机器指令,不需要将源程序翻译成目标代码后再执行。

如果单从编程语言发展的初期历史来讲,php属于解释性编程语言,其在每次执行时,引擎会将source code解释翻译为一种叫做“中间码”的东西,类似java语言的字节码,但并不是二进制机器码;因为每执行一次就解释一次,因此会带来额外的开销;

request请求(nginx,apache,cli等)-->Zend引擎读取.php文件-->扫描其词典和表达式 -->解析文件-->创建要执行的计算机代码(称为Opcode)-->最后执行Opcode--> response 返回。

每一次请求PHP脚本都会执行一遍以上步骤,如果PHP源代码没有变化,那么Opcode也不会变化,显然没有必要每次都重新生成Opcode,我们可以把Opcode缓存下来,以后直接访问缓存的Opcode岂不是更快。

为了提升因效率,人们想出的办法就是将解释后的结果缓存,来提升性能;

于是,zend官方开发了zend_opcache;但在opcache未出来之前,相继出现过APC、eAccelerator,XCache等加速插件,其原理都类似,都是将php解释执行后的结果缓存到内存中,从而避免重复的编译过程,这样就能够直接使用共享缓存中的编译结果码,从而提升执行效率,降低服务器负载,特征就是会带来额外的内存开销;后来php官方开发了opcache后,就逐步的替代了其他的加速插件;在php5.5版本之前,php是没有直接捆绑opcache模块的,在使用之前,需要开发者自己通过安装并扩展opcache,如pecl官网中下载对应的zendopcache-7.0.5.tgz;在php5.5及其以上版本中,直接集成并捆绑了opcache,如下载编译安装php5.6.38版本后,我们可以在默认目录下看到对应的php扩展,见

/lib/php/extensions/no-debug-non-zts-20131226

如果想开启opcache.so,需要在php.ini中增加或修改相应配置项的值,使opcache能被正确的加载,比如:

zend_extension=opcache.so

[opcache]

opcache.memory_consumption=128//共享内存的大小

opcache.interned_strings_buffer=8

opcache.max_accelerated_files=4000

opcache.revalidate_freq=60//60s检查一次文件更新

opcache.fast_shutdown=1

opcache.enable=1 //打开opcache扩展

opcache.enable_cli=1

核心配置项如validate_timestamps,如果该项设置为1,则opcache会自动检查脚本的时间戳,检测的周期为revalidate_freq;如果设置为0,则开发者只能手动的刷新opcache或者重启web 服务使更新后的php脚本生效;在validate_timestamps设置为1的前提下,revalidate_freq才有效,revalidate_freq表示检查更新的周期,默认为2,表示每隔2秒钟opcache会自动检测php脚本是否更新,如果将revalidate_freq设置为0,则每次请求时opcache都会进行检测;

在开发/测试环境中,因需所改即所得,如无特殊用途,是不需要开启opcache的;

在生产环境中,开启opcache时建议合理配置上述项的值;

本次分享主要以opcache为主来展开,欢迎大家在留言区留言参与讨论~

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181101G0MF9R00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券