前言:由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

最新文章

  1. 【Gson】互相转化
  2. SpringBoot之springfox(Swagger) (ApiDoc接口文档)
  3. 爬虫技术 -- 基础学习(五)解决页面编码识别(附c#代码)
  4. String的那一大堆事儿--1
  5. MATLAB文件操作及读txt文件
  6. HDU1285——确定比赛名次
  7. Java关键字static
  8. 途牛java实习面试(失败)
  9. mysql 错误 ERROR 1030 Got error 28 from
  10. ClientDataSet使用locate或Filter定位到字段为空值的记录
  11. JVM虚拟机查找类文件的顺序
  12. JXL读取Excel(只支持xls版本)——(二)
  13. 085 HBase的二级索引,以及phoenix的安装(需再做一次)
  14. Linux下多节点SSH无密码互联实现
  15. TABLE中动态设置poplist的值跟着当前行的某些列动态变化
  16. 配置ssh
  17. ionic 隐藏header-ionic中隐藏头部header
  18. Inception-Resnet-V2
  19. AC日记——数据流中的算法 51nod 1785
  20. 集成SpringMVC, Spring, Mybatis环境

热门文章

  1. SpringBoot配置RestTemplate的代理和超时时间
  2. 10、java5线程池之返回结果的任务之Callable与Future
  3. 【树莓派+.NET MF打造视频监控智能车】遥控篇
  4. excel文件批量重命名
  5. excel 上标和下标
  6. appium架构分析
  7. 使用google chart api生成报表图片
  8. 在发送信息时应用PendingIntent.FLAG_UPDATE_CURRENT
  9. Android中创建倒影效果的工具类
  10. android 发送短信的两种方式,以及接收报告和发送报告