APC(Alternative PHP Cache)——PHP opcode缓存

Alternative PHP Cache (APC) 是一个开放自由的PHP opcode 缓存。它的目标是提供一个自由、 开放,和健全的框架用于缓存和优化PHP的中间代码。PHP官方手册。APC是一个PHP缓存。它在内存中存储PHP页面并且减少了硬盘的I/O。这对于性能的提升十分明显。你甚至可以在CPU使用率下降50%的情况下提升系统50%的性能。

此 » PECL 扩展未与 PHP 捆绑。

安装此 PECL 扩展相关的信息可在手册中标题为 PECL 扩展的安装章节中找到。更多信息如新的发行版本、下载、源文件、 维护人员信息及变更日志等,都在此处: » http://pecl.php.net/package/apc.

 

版本的问题:

  • PHP5.0+版本,APC 都支持。Linux、Unix操作系统都支持。win 操作系统的DLL文件,PHP官方只支持PHP5.3+版本。
  • PHP5.0~5.2版本,若安装APC 就不能安装 zend optimizer,两者冲突。若必须安装zend optimizer,那么只能安装其他的opcode缓存软件,例如eaccelerator
  • PHP5.3+版本,PHP放弃了对zend optimizer的支持。

 

win 系统下安装APC

1、在win下使用APC,需要 php_apc.dll文件,PHP5.3+版本,直接到PHP官方下载即可。其他版本,百度搜索下吧,网络上有很多,一定要根据自己使用的PHP版本来下载apc文件。

2、把php_apc.dll 复制到 PHP安装目录/ext/

3、打开php.ini。向其中的拓展区域部分添加如下代码

extension=php_apc.dll
apc.enabled = 1
apc.shm_segments = 1
apc.shm_size = 64
apc.optimization = 0
apc.num_files_hint = 1000
apc.ttl = 0
apc.gc_ttl = 3600
apc.cache_by_default = On
apc.slam_defense = 0
apc.file_update_protection = 2
apc.enable_cli = 0
apc.stat=0


4、保存php.ini。重新启动你的IIS或者Apache。就安装成功了..

使用phpinfo查看是否成功安装
phpinfo();

设置临时目录
APC需要一个临时目录来存储文件。它会尝试在windows的临时目录缓存文件,事先请给临时目录写的权限。

//由缓存使用的内存数量使用这个公式来计算:

total_memory = apc.shm_segments * apc.shm_size

Linux 系统下安装APC

当前我用的是APC-3.0.19 stable ,用户自己到 http://pecl.php.net/package/APC 下载最新版。

①安装

wget http://pecl.php.net/get/APC-3.0.19.tgz
tar xzvf APC-3.0.19.tgz
/usr/local/webserver/php/bin/phpize
./configure –enable-apc –enable-apc-mmap –with-php-config=/usr/local/webserver/php/bin/php-config –prefix=/usr/local/apc
make && make install

注:安装编译后检查相应目录:

ll /usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/
-rwxr-xr-x 1 root root 416628 12-15 17:13 apc.so

安装成功!

②配置/etc/php.ini

vi /usr/local/webserver/php/etc/php.ini

shift+g到最末行,末尾加入

[apc]
extension=”apc.so”
apc.enabled = 1
apc.cache_by_default = on
apc.shm_segments = 1
apc.shm_size = 64
apc.ttl = 7200
apc.user_ttl = 7200
apc.num_files_hint = 0
apc.write_lock = On

然后把APC目录下的apc.php复制到可以访问的目录

cp /data0/software/APC-3.0.19/apc.php /data0/htdocs/blog/

③重启服务器

reboot

④安装结果演示:

PHP-APC
phpinfo显示结果



 

php.ini中配置APC

默认指令

apc.cache_by_default = On
apc.enable_cli = Off
apc.enabled = On
apc.file_update_protection = 2
apc.filters =
apc.gc_ttl = 3600
apc.include_once_override = Off
apc.max_file_size = 1M
apc.num_files_hint = 1000
apc.optimization = Off
apc.report_autofilter = Off
apc.shm_segments = 1
apc.shm_size = 30
apc.slam_defense = 0
apc.stat = On
apc.ttl = 0
apc.user_entries_hint = 100
apc.user_ttl = 0
apc.write_lock = On

 

;alternative php cache 用于缓存和优化php中间代码   
   
apc.cache_by_default = on 
;sys   
;是否默认对所有文件启用缓冲。   
;若设为off并与以加号开头的apc.filters指令一起用,则文件仅在匹配过滤器时才被缓存。   
   
apc.enable_cli = off 
;sys   
;是否为cli版本启用apc功能,仅用于测试和调试目的才打开此指令。   
   
apc.enabledi = on 
;是否启用apc,如果apc被静态编译进php又想禁用它,这是唯一的办法。   
   
apc.file_update_protection = 2 
;sys   
;当你在一个运行中的服务器上修改文件时,你应当执行原子操作。   
;也就是先写进一个临时文件,然后将该文件重命名(mv)到最终的名字。   
;文本编辑器以及 cp, tar 等程序却并不是这样操作的,从而导致有可能缓冲了残缺的文件。   
;默认值 2 表示在访问文件时如果发现修改时间距离访问时间小于 2 秒则不做缓冲。   
;那个不幸的访问者可能得到残缺的内容,但是这种坏影响却不会通过缓存扩大化。   
;如果你能确保所有的更新操作都是原子操作,那么可以用 0 关闭此特性。   
;如果你的系统由于大量的io操作导致更新缓慢,你就需要增大此值。   
   
apc.filters =   
;sys   
;一个以逗号分隔的posix扩展正则表达式列表。   
;如果源文件名与任意一个模式匹配,则该文件不被缓存。   
;注意,用来匹配的文件名是传递给include/require的文件名,而不是绝对路径。   
;如果正则表达式的第一个字符是"+"则意味着任何匹配表达式的文件会被缓存,   
;如果第一个字符是"-"则任何匹配项都不会被缓存。"-"是默认值,可以省略掉。   
   
apc.ttl = 0 
;sys   
;缓存条目在缓冲区中允许逗留的秒数。0 表示永不超时。建议值为7200~36000。   
;设为 0 意味着缓冲区有可能被旧的缓存条目填满,从而导致无法缓存新条目。   
   
apc.user_ttl = 0 
;sys   
;类似于apc.ttl,只是针对每个用户而言,建议值为7200~36000。   
;设为 0 意味着缓冲区有可能被旧的缓存条目填满,从而导致无法缓存新条目。   
   
apc.gc_ttl = 3600 
;sys   
;缓存条目在垃圾回收表中能够存在的秒数。   
;此值提供了一个安全措施,即使一个服务器进程在执行缓存的源文件时崩溃,   
;而且该源文件已经被修改,为旧版本分配的内存也不会被回收,直到达到此ttl值为止。   
;设为零将禁用此特性。   
   
apc.include_once_override = off 
;sys   
;关于该指令目前尚无说明文档,参见:http://pecl.php.net/bugs/bug.php?id=8754   
;请保持为off,否则可能导致意想不到的结果。   
   
apc.max_file_size = 1m 
;sys   
;禁止大于此尺寸的文件被缓存。   
   
apc.mmap_file_mask =    
;sys   
;如果使用–enable-mmap(默认启用)为apc编译了mmap支持,   
;这里的值就是传递给mmap模块的mktemp风格的文件掩码(建议值为"/tmp/apc.xxxxxx")。   
;该掩码用于决定内存映射区域是否要被file-backed或者shared memory backed。   
;对于直接的file-backed内存映射,要设置成"/tmp/apc.xxxxxx"的样子(恰好6个x)。   
;要使用posix风格的shm_open/mmap就需要设置成"/apc.shm.xxxxxx"的样子。   
;你还可以设为"/dev/zero"来为匿名映射的内存使用内核的"/dev/zero"接口。   
;不定义此指令则表示强制使用匿名映射。   
   
apc.num_files_hint = 1000 
;sys   
;web服务器上可能被包含或被请求的不同源文件的大致数量(建议值为1024~4096)。   
;如果你不能确定,则设为 0 ;此设定主要用于拥有数千个源文件的站点。   
   
apc.optimization = 0 
;优化级别(建议值为 0 ) 。   
;正整数值表示启用优化器,值越高则使用越激进的优化。   
;更高的值可能有非常有限的速度提升,但目前尚在试验中。   
   
apc.report_autofilter = off 
;sys   
;是否记录所有由于early/late binding原因而自动未被缓存的脚本。   
   
apc.shm_segments = 1 
;sys   
;为编译器缓冲区分配的共享内存块数量(建议值为1)。   
;如果apc耗尽了共享内存,并且已将apc.shm_size指令设为系统允许的最大值,   
;你可以尝试增大此值。   
   
apc.shm_size = 30 
;sys   
;每个共享内存块的大小(以mb为单位,建议值为128~256)。   
;有些系统(包括大多数bsd变种)默认的共享内存块大小非常少。   
   
apc.slam_defense = 0 
;sys(反对使用该指令,建议该用apc.write_lock指令)   
;在非常繁忙的服务器上,无论是启动服务还是修改文件,   
;都可能由于多个进程企图同时缓存一个文件而导致竞争条件。   
;这个指令用于设置进程在处理未被缓存的文件时跳过缓存步骤的百分率。   
;比如设为75表示在遇到未被缓存的文件时有75%的概率不进行缓存,从而减少碰撞几率。   
;鼓励设为 0 来禁用这个特性。   
   
apc.stat = on 
;sys   
;是否启用脚本更新检查。   
;改变这个指令值要非常小心。   
;默认值 on 表示apc在每次请求脚本时都检查脚本是否被更新,   
;如果被更新则自动重新编译和缓存编译后的内容。但这样做对性能有不利影响。   
;如果设为 off 则表示不进行检查,从而使性能得到大幅提高。   
;但是为了使更新的内容生效,你必须重启web服务器。   
;这个指令对于include/require的文件同样有效。但是需要注意的是,   
;如果你使用的是相对路径,apc就必须在每一次include/require时都进行检查以定位文件。   
;而使用绝对路径则可以跳过检查,所以鼓励你使用绝对路径进行include/require操作。   
   
apc.user_entries_hint = 100 
;sys   
;类似于num_files_hint指令,只是针对每个不同用户而言。   
;如果你不能确定,则设为 0 。   
   
apc.write_lock = on 
;sys   
;是否启用写入锁。   
;在非常繁忙的服务器上,无论是启动服务还是修改文件,   
;都可能由于多个进程企图同时缓存一个文件而导致竞争条件。   
;启用该指令可以避免竞争条件的出现。   
   
apc.rfc1867 = off 
;sys   
;打开该指令后,对于每个恰好在file字段之前含有apc_upload_progress字段的上传文件,   
;apc都将自动创建一个upload_的用户缓存条目(就是apc_upload_progress字段值)。

 

 

监控、管理APC

源文件安装包中的 apc.php 就是管理监控APC缓存的工具。复制粘贴此文件到你的web服务器,便于在浏览器中直接读取此脚本。 http://YOUR_HOST/apc.php 脚本中 ADMIN_PASSWORD,设置密码。

监控管理APC