分类: 系统运维
2014-07-07 18:13:04
一 APC的安装:
首先下载源码包,并解压:
1
2 3 |
wget http://pecl.php.net/get/APC-3.1.13.tgz
tar -zxvf APC-3.1.13.tgz cd APC-3.1.13.tgz |
安装:
首先必须运行PHP目录下的/usr/local/php/bin/phpize
然后继续配置编译安装
/usr/local/php/bin/phpize
./configure --enable-apc --enable-apc-mmap --enable-apc-spinlocks --disable-apc-pthreadmutex --enable-apc-memprotect --with-php-config=/usr/local/php/bin/php-config --with-libdir=/usr/local/php/lib/php
make && make install
最后编辑php.ini文件加入如下内容:
一般php.ini文件位于php的etc目录内,如:/usr/local/php/etc/php.ini
1
2 3 4 5 6 7 8 9 10 |
extension = "apc.so";
;APC setting apc.enabled = 1 apc.shm_segments = 1 apc.shm_size = 64M apc.optimization = 1 apc.num_files_hint = 0 apc.ttl = 0 apc.gc_ttl = 3600 apc.cache_by_default = on |
完成后重启php即可。
二 APC的配置详解:
介绍
APC全称Alternative Cache是一个免费开源的php缓存插件,它的目标是提供一个自由,开放和强大的框架用于缓存和优化PHP中间代码.The Alternative PHP
Cache (APC) is a free and open opcode cache for PHP. Its goal is to provide a
free, open, and robust framework for caching and optimizing PHP intermediate
code.
APC可以直接用于缓存php文件内容,也可以用于存储key/value数据.对于运维来说大多用于前者,对于程序员来说,大于用后者. 下一节贴一个关于APC存储key/value数据的实例. 常用类似缓存插件有xache和,先熟悉如下关于apc的配置.
php.ini配置
[apc]
; alternative php cache
用于缓存和优化php中间代码
apc.cache_by_default = on
;sys
; 是否默认对所有文件启用缓冲。
;
若设为off并与以加号开头的apc.filters指令一起用,则文件仅在匹配过滤器时才被缓存。
apc.enable_cli = off
;sys
; 是否为cli版本启用apc功能,仅用于测试和调试目的才打开此指令。
apc.enabled = 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
;
关于该指令目前尚无说明文档,参见:
;
请保持为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缓存
实例地址贴上:
本文摘自网络:http://koda.iteye.com/blog/275869
运维生存时间整理:
前言
最近在重写某系统, 有个地方需要include一大数组文件,差不多有1.2M,程序每次跑到这块代码都需要从硬盘读取内容,站点访问量达了势必会造成过量的IO. 考虑使用,等KV存储,但是担心IO过大造成网络阻塞。那安装到本地呢,每台都需要安装岂不是太麻烦了.于是觉得尝试将数组存入本机内存中.与APC二选一,eaccelerator
0.6.5.1之后的版本不支持eaccelerator_put方法,索性直接使用apc,如何安装以及我就不详细讲解了.
例子很简单,废话太多,进入正题.
简介
APC全称Alternative PHP
Cache是一个免费开源的php缓存插件,它的目标是提供一个自由,开放和强大的框架用于缓存和优化PHP中间代码.
APC配置
php.ini
[apc] |
extension = php_apc.dll |
apc.enabled = on |
apc.cache_by_default = off //一定要off,否则所有php都会被cache |
apc.shm_segments = 2 |
apc.shm_size = 128M // 单位M或者G,网上很多没写,会报错 |
apc.ttl = 7200 |
apc.user_ttl = 7200 |
apc.num_files_hint = 1024 |
apc.write_lock = On |
apc.gc_ttl=3600 |
apc.ttl=0 |
apc.max_file_size=2M //最大单个文件大小 |
APC VS include方法
大文件数组内容:
arrFile.php
$arr = array( |
"aaaa"=>11, |
"BBBBB"=>11, |
....忽略几万个 |
"CCCCC"=>11 |
) |
include文件代码片段
include_once 'arrFile.php'; |
print_r($arr); |
?> |
APC加速文件代码片段
$arr=apc_fetch('key'); # 读取apc缓存 |
$arr=unserialize($arr); |
?> |
include与apc性能对比
全部代码如下
/** |
* 站点: |
* 作者:凉白开 |
* QQ群:3951405 |
*/ |
# include array file |
$ti1 = microtime ( true ); |
include_once 'arrFile.php'; |
$ti2 = microtime ( true ); |
$ti3=(($ti2 - $ti1) * 1000); |
echo "加载文件数组耗时:".$ti3. 'ms '; |
# apc save |
$arrSeri=serialize($arr); //将上面include的数组序列化 |
apc_add("key",$badSeri,300); //序列化后的文件保存到apc缓存中,键为key,过期时间300秒 |
# 写入一次即可,后续都直接在内存中获取. |
# apc fetch |
$ta1 = microtime ( true ); |
$a=apc_fetch('key'); // 从apc中取出内容 |
$arr=unserialize($a); |
$ta2 = microtime ( true ); |
$ta3=(($ta2 - $ta1) * 1000); |
echo "加载apc数组耗时:".$ta3 . 'ms '; |
# result 对比结果 |
echo round(($ti3-$ta3)/$ta3*100,2) .'%'; // APC比include快百分之几 |
?> |
测试截图如下:
最后
代码很简单,简单的将apc当做来使用,相比include时间要缩短2倍左右,最慢的情况下时间也缩短一倍. 下回测试存储大数组需要多少时间. 本文不是告诉大家非要使用apc、使用apc读写大数组不一定是最好的方法,但是这个方法或许大家的工作可以用上,这边抛出的仅仅是一个思路,望大家可以用上.
转载请注明出处:http:///html/2847.html