zoukankan      html  css  js  c++  java
  • php的opcode缓存

    前言:由php的运行机制决定,其实php在运行阶段我们也是可以进行缓存的从而提高程序运行效率,这就是我们常说的opcode缓存。
    1、简述php的运行机制
    (因为本文是写opcode缓存的所以这里只是简要概述,后边会专门写一篇揭秘php运行机制的。)
    a).php文件通过浏览器过来
    b)请求交给SAPI,随后SAPI层将控制权转给PHP
    c)zend_language_scanner对代码进行扫描,对php代码进行词法分析转换成一系列的tokens array
    d)zend_language_parser将c步骤产生的一系列tokens处理掉空格等无用的代码以后转换成一系列表达式
    e)经过compiler阶段生成opcode返回zend_op_array指针
    f)zend_vm_execute根据传入的zend_op_array指针,执行opcode并将结果返回输出
    (下图来自互联网,但是描述的很不错借花献佛了)

    2、opcode简介
    Opcode是operation code(操作码)的简称,其实就是第一小节c)、d)、e)步骤产生的一种中间码,
    opcode是一个四元组,(opcode, op1, op2, result),它们分别代表操作码,第一操作数,第二操作数,结果。
    如:

    <?php
    echo "taobao search blog";
    ?>
    

     对应的tokens

    Array
    (
        [0] => Array
            (
                [0] => 367
                [1] => <?php
                [2] => 1
            )
     
        [1] => Array
            (
                [0] => 316
                [1] => echo
                [2] => 1
            )
     
        [2] => Array
            (
                [0] => 370
                [1] =>
                [2] => 1
            )
     
        [3] => Array
            (
                [0] => 315
                [1] => "taobao search blog"
                [2] => 1
            )
     
        [4] => ;
        [5] => Array
            (
                [0] => 370
                [1] =>
                [2] => 1
            )
     
        [6] => Array
            (
                [0] => 369
                [1] => ?>
                [2] => 1
            )
     
    )
    

    对应的opcode就是:

    line     # *  op                           fetch          ext  return  operands
    ---------------------------------------------------------------------------------
       2     0  >   ECHO                                                     'taobao+search+blog'
       4     1    > RETURN                                                   1
             2*   > ZEND_HANDLE_EXCEPTION
    

     3、使用apc对opcode缓存
    a)假设php路径为/home/ad/php
    对opcode进行缓存的软件很多(apc、eAcclerator、Xcache、Zend Platform),这里主要介绍apc
    APC提供两种缓存功能,即缓存Opcode(目标文件),我们称之为apc_compiler_cache。同时它还提供一些接口用于PHP开发人员将用户数据驻留在内存中,我们称之为apc_user_cache。我们这里主要讨论apc_compiler_cache的配置。
    下载地址:http://pecl.php.net/package/APC
    最新版本为APC-3.1.6.tgz

    wget http://pecl.php.net/get/APC-3.1.6.tgz
    tar -zxvf APC-3.1.6.tgz
    cd APC-3.1.6
    /home/ad/php/bin/phpize
    ./configure --enable-apc --enable-apc-mmap  --with-php-config=/home/ad/php/bin/php-config
    make
    make install
    

     编辑php.ini
    添加apc的配置

    [apc]
    extension=apc.so
    apc.enabled=1
    apc.shm_segments = 1
    apc.shm_size = 128
    apc.ttl = 0
    apc.user_ttl = 7200
    apc.num_files_hint = 1000
    apc.write_lock=1
    apc.stat = 0
    apc.max_file_size=1M
    apc.filters = a.php,b.php
    apc.cache_by_default=1
    

    重新apache就ok啦

    4、常用参数的解析
    apc.enabled 开启apc 设置为0关闭,1为开启
    apc.shm_segments 共享内存块数
    apc.shm_size 共享内存大小,但是是M
    那么显然共享内存的总数就是apc.shm_segments*apc.shm_size
    apc.num_files_hint 允许多少个opcode被缓存
    apc.stat 为1的时候会自动检查opcode对应的php文件是否有更新,有更新的话会自动更新。设置为0的话就不会去检查了这样会提高apc的效率,但是要使php的修改生效的话就必须重启apache了,或者使用函数apc_cache_clear()来清空缓存
    apc.ttl opcode缓存的过期时间,设置为0表示不过期,如果不为0会检查两次请求之间的时间,如果时间大于设置值那么会更新opcode缓存
    apc.write_lock 表示多个进程同时更新一份opcode缓存的时候那么只让最先的一个生效,可以有效避免写冲突
    apc.max_file_size 超过设置值大小的文件不被缓存
    apc.filters 需要特例的文件,多个文件用逗号(,)相隔
    apc.filters 与 apc.cache_by_default结合使用,
    当apc.cache_by_default为1时apc.filters文件不被缓存,当apc.cache_by_default为0时仅apc.filters文件被缓存

    5:apc使用例子

    案例一:使用PHP的APC模块制作上传进度条

    https://www.ttlsa.com/php/php-apc-upload-process/

    案例二:opcache安装配置

    http://blog.jjonline.cn/linux/135.html

  • 相关阅读:
    Android SDK Manager 无法下载更新,或者更新速度超慢,或者待安装包列表不显示
    window 下Qt for android 环境搭建
    vim 编辑器的设置
    用户登录案例 展示 三层架构
    简单的SqlHelper
    利用webclient ftpclient上传下载文件
    绑定省市到treeview 递归加载 递归删除
    MD5 文件和字符传加密
    MVC4 EF5.0 实现异步删除和修改 easyui
    MVC中应用ajax的两种方式
  • 原文地址:https://www.cnblogs.com/Alight/p/5257560.html
Copyright © 2011-2022 走看看