Apc缓存Opcode

1、PHP执行

PHP的运行阶段也分成三个阶段:

    • Parse。语法分析阶段。
    • Compile。编译产出opcode中间码。
    • Execute。运行,动态运行进行输出。
                                           

      由于PHP是个解释型语言执行的时候先得把程序读进来,然后由Zend引擎编译成opcode。最后Zend虚拟机顺次执行这些opcode(指令)完成操作。因此我们可 以把这个Opcode缓存起来,下次就能避免重新编译了。

 

APC缓存作用如下:

                                                       


2 、APC简介

        Alternative PHP Cache (APC) 是一个开放自由的PHP opcode 缓存。它的目标是提供一个自由、 开放,和健全的框架用于缓存和优化PHP的中间代码。

      PHP APC提供两种缓存功能,即缓存Opcode(目标文件),我们称之为apc_compiler_cache。同时它还提供一些接口用于PHP开发人  

         APC的主页是:php apc 。目前的版本是3.1.13,通过PECL安装,需要php4.3.0或更高版本


3、安装配置

一般是下载源代码然后phpize来编译安装,安装完以后在加上php.ini里加上
extension=apc.so
这么一行就行了. 具体步骤如下:

下载:http://pecl.php.net/get/APC-3.1.5.tgz

# tar -xzvf APC-3.1.5.tgz

#cd  APC-3.1.5

# /usr/bin/phpize

# ./configure --enable-apc --enable-mmap --enable-apc-spinlocks --disable-apc-pthreadmutex

#make

#make install

php.ini

查找extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/"

下面添加extension = "apc.so"

配置php.ini 末尾加入

;;;;;;;;;;;;;;;;;;;  

;  ;

; Apc Settings ;  

;                 ;

;;;;;;;;;;;;;;;;;;; 

apc.rfc1867 = on

;最大上传文件 

apc.max_file_size = 800M   

;允许apc

apc.enabled = 1  

;对编译器缓存要分配的共享内存块的数目        

apc.shm_segments = 1 

;apc.shm_size就是给APC开的缓存大小,以 MB 为单位的每个共享内存块的大小

apc.shm_size = 64   

;优化级别。设为 0 则禁用优化器,更高的值则使用更主动的优化。    

apc.optimization = 0    

;Web 服务器上的被包含或被请求的不同源文件的数目的大概估计

apc.num_files_hint = 1000 

;缓存条目在缓冲区所允许的空闲时间的秒数

apc.ttl = 0      

;缓存条目在垃圾回收表中能够存在的秒数           

apc.gc_ttl = 3600

;默认为 on,但可以设为 off 并和加号开头的 apc.filters 一起用 

;/*则文件仅在匹配过滤器时被缓存。*/        

apc.cache_by_default = On 

apc.slam_defense = 0

apc.file_update_protection = 2

apc.enable_cli = 0            

;调试

apc.stat=0

win下安装也很简单

   1).下载php_apc.dll 到PHP的ext目录下 

   2).修改php.ini 添加extension=php_apc.dll 

然后设置apc各个选项

配置详解:

http://www.php.net/manual/zh/apc.configuration.php

          重新启动apache服务器,查看phpinfo中是否有apc的配置项目,有的话就配置成功了. 

注意事项
apc.stat=1/0

这个选项是否启用脚本更新检查。 改变这个指令值要非常小心。 默认值 On 表示APC在每次请求脚本时都检查脚本是否被更新, 如果被更新则自动重新编译和缓存编译后的内容。但这样做对性能有不利影响。 如果设为 Off 则表示不进行检查,从而使性能得到大幅提高。 但是为了使更新的内容生效,你必须重启Web服务器(译者注:如果采用cgi/fcgi类似的,需重启cgi/fcgi进程)。 生产服务器上脚本文件很少更改, 可以通过禁用本选项获得显著的性能提升。

这个指令对于include/require的文件同样有效。但是需要注意的是, 如果你使用的是相对路径,APC就必须在每一次include/require时都进行检查以定位文件。 而使用绝对路径则可以跳过检查,所以鼓励你使用绝对路径进行include/require操作。

我在测试Ethna框架的时候:
里面很多地方包含文件都是使用相对路径,第一次执行是可以的。然后再次执行的就找不到包含文件了,除非设置set_include_path.

4、APC管理界面

 到pecl.php.net下载 apc源码包有个apc.php,copy到你的web server可以访问到的地方,浏览即可访问。

管理界面功能有:

1. Refresh Data

2. View Host Stats

3. System Cache Entries  (缓存opcode码)

4. User Cache Entries (用户自定义的缓存数据)

5. Version Check

    


 

5. APC的使用

APC的使用其实倒说不上.APC是个优化器,自安装之日起,就默默地在后台为您的PHP应用服务了.您的所有PHP代码会被缓存起来.

另外,APC可提供一定的内存缓存功能.但是这个功能并不是十分完美,有报告说如果频繁使用APC缓存的写入功能,会导致不可预料的错误.如果想使用这个功能,可以看看apc_fetch,apc_store等几个与apc缓存相关的函数.
从PHP5.2开始,APC引入了一个小甜饼,解决了困扰大家已久的大文件上传的进度条问题.。

6. APC的高级使用

1.缓存期限:

APC的缓存分两部分:系统缓存和用户数据缓存.

系统缓存: 是自动使用的,是指APC把PHP文件源码的编译结果缓存起来,然后在再次调用时先对比时间标记。如果未过期,则使用缓存代码运行。默认缓存 3600s(一小时).但是这样仍会浪费大量CPU时间.因此可以在php.ini中设置system缓存为永不过期(apc.ttl=0).不过如果这样设置,改运php代码后需要restart一下您的web服务器(比如apache…).目前对APC的性能测试一般指的是这一层cache;

 
用户数据缓存:由用户在编写php代码时用apc_store和apc_fetch函数操作读取、写入的.如果量不大的话我建议可以使用一下.如果量大,我建议使用memcache会更好.
如果要享受APC带来的缓存大文件上传进度的特性,需要在php.ini中将apc.rfc1867设为1,并且在表单中加一个隐藏域APC_UPLOAD_PROGRESS,这个域的值可以随机生成一个hash,以确何唯一.具体例子请参见前面给出的链接.

6、测试效率

    从Ethna框架来测试:

    第一次执行:

     Time:260.53491973877ms
   memory:6.2379684448242MB

   第二次执行:

   Time:199.43404197693ms
   memory:1.1883926391602MB

    性能提高了30%。

7、题外话

    Ethna框架(日本人开发的php框架)的性能很低的,我用xdebug跟踪,发现

    Ena_Controller::main('Ena_Controller', 'index')大概用了230ms,这个方法里面执行自己定义的模块耗时90秒左右(其中自定义模块也包括mysql操作耗时)

    也就是框架Ethna耗时140ms左右(230-90)。

    我们一般测试的php耗时都在100ms以内,超过100ms,就得检查哪个地方出问题了:是不是mysql慢查询、缓存数据过大等等。

     这应该日本人比较崇尚编程从人的角度考虑问题,而不是从机器着想的原因吧。

      从Ruby的开发理念: “ 人们特别是电脑工程师们,常常从机器着想。‘这样做,机器就能运行的更快;这样做,机器运行效率更高;这样做,机器就会怎样怎样怎样。’实际上,我们需要从人的角度考虑问题,人们怎样编写程序或者怎样使用机器上应用程序。我们是主人,他们是仆人。 ”我们就明白了,Ethna确实方便开发者的,而不是主要考虑性能的问题。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值