zoukankan      html  css  js  c++  java
  • 现代 PHP 新特性系列(六) —— Zend Opcache

    1、概述

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

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

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

     

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

    2、启用Zend Opcache

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

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

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

        zend_extension=/path/to/opcache.so

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

        php-config --extension-dir

    注:如果你使用Xdebug,需要在php.ini中先加载Zend Opcache,再加载Xdebug。

           更新php.ini后重启PHP进程并查看是否启用成功:

          

    3、配置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的配置,PHP官网中列出了Zend Opcache的全部设置:http://ua2.php.net/manual/zh/opcache.configuration.php

    4、使用Zend Opcache

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

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

        opcache.validate_timestamps=1
        opcache.revalidate_freq=0
  • 相关阅读:
    gain 基尼系数
    luogu P5826 【模板】子序列自动机 主席树 vector 二分
    牛客挑战赛39 树与异或 离线 树上莫队 树状数组 约数
    4.22 省选模拟赛 三元组 manacher 回文自动机
    4.22 省选模拟赛 最优价值 网络流 最大权闭合子图
    4.18 省选模拟赛 消息传递 树剖 倍增 线段树维护等比数列
    luogu P4008 [NOI2003]文本编辑器 splay 块状链表
    牛客挑战赛39 密码系统 后缀数组
    luogu P1526 [NOI2003]智破连环阵 搜索+最大匹配+剪枝
    luogu P4095 [HEOI2013]Eden 的新背包问题 多重背包 背包的合并
  • 原文地址:https://www.cnblogs.com/mzhaox/p/11222026.html
Copyright © 2011-2022 走看看