PHP APC缓存配置、使用详解 |
本文标签:php,apc,apc缓存 一、APC缓存简介 通过求余操作,定位当前key的在slots数组中的位置: cache->slots[key.h % cache->num_slots]; 复制代码 代码如下: extension=php_apc.dll apc.rfc1867 = on apc.max_file_size = 100M upload_max_filesize = 100M post_max_size = 100M //以上参数可自己定义 第三步:检查是否支持PHP APC apc_store apc_fetch 查看phpinfo中是否有apc相关项 B.LIUNX下安装APC 复制代码 代码如下: 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 第三步:检查安装是否成功 重启apache 或者 /usr/local/php/sbin/php-fpm restart 查看phpinfo中是否有apc相关项 三、配置参数详解和使用总结 1).APC模块的参数配置详解 复制代码 代码如下: apc.enabled 布尔型 apc.enabled 可以被设成 0 来禁用 APC 。这主要是有用的,当 APC 被静态编译入 PHP 时,因为没有其它方法来禁用它(当编译为 DSO 的时候,可以将 php.ini 中的 extension 行注释掉) 。 apc.shm_segments 整型 对编译缓存分配共享内存块的数量 。如果APC用光了共享内存,而且你已经设置apc.shm_size为系统允许的最大值的情况下,你可以试着去提高这个参数的值 。 apc.shm_size 整型 每个共享内存块的大小是以MB为单位的 。在默认情况下,一些系统(包括大多数BSD变种系统)的共享内存块的大小限制的很低 。 apc.optimization 整型 优化等级 。设为0则禁用优化,越高的值使用越强有力的优化 。期待有适度的速度上的改进 。这个还是实验性质的 。 apc.num_files_hint 整型 对在你的Web服务器上被包含和请求的不同的源文件的数量的提示 。如果你无法确定,设置为0或者省略;这个设置主要可能用于有成千的源文件的站点 。 apc.ttl 整型 当一个缓存条目在缓存区的位置被另一个条目需要时,我们需要考虑的是这个缓存条目在缓存区的位置被允许空闲的秒数 。将这个参数设置为0意味着你的缓存可能充满不新鲜的条目,同时导致新的条目无法被缓存 。 apc.gc_ttl 整型 缓存条目在垃圾收集列表中存活的秒数 。这个值提供了出错保护在执行一个缓存源文件,而同时服务器进程死了的事件中 。如果那个源文件被修改,内存分配给旧版本的缓存条目将不会被回收,直到这个参数设定的TTL值到的时候 。设置为0就是禁止这个特性 。 apc.cache_by_default 布尔型 默认为On,但可以被设置为Off并和以加号开头的apc.filters配合使用,文件仅仅在匹配过滤器时才被缓存 。 apc.filters 字符串 一个以逗号分割的POSIX扩展正则表达式的列表 。如果任何模式匹配源文件名,这个文件将不会被缓存 。注意用来匹配的文件名是传递给 include/require 的文件名,而不是绝对路径 。如果正则表达式的第一个字符是 + ,则这个表达式就意味着任何匹配表达式的文件将会被缓存,如果第一个字符是 - 则任何匹配都不会被缓存 。 - 是默认值,所以可以被省略 。 apc.mmap_file_mask 字符串 (这段实在不太懂,所以没有翻译) If compiled with MMAP support by using --enable-mmap this is the mktemp-style file_mask to pass to the mmap module for determing whether your mmaped memory region is going to be file-backed or shared memory backed. For straight file-backed mmap, set it to something like/tmp/apc.XXXXXX (exactly 6 Xs). To use POSIX-style shm_open/mmap put a .shm somewhere in your mask. e.g. /apc.shm.XXXXXX You can also set it to /dev/zero to use your kernels/dev/zero interface to anonymous mmaped memory. Leaving it undefined will force an anonymous mmap. apc.slam_defense 整型 在非常繁忙的服务器上,无论你启动服务还是修改文件,你都会导致一种多进程都试图在同一个时间缓存同一个文件的竞争 。这个选项设置了进程跳过试图去缓存一个未被缓存的文件的百分比 。或者可以把这个想象成一个单独进程跳过缓存的机率 。例如,设置apc.slam_defense为75就意味着进程有75%的机率不去缓存未被缓存的文件 。所以,设置的越高,越能减少缓存的碰撞机率 。设置为0则禁用这个特性 。 apc.file_update_protection 整型 当你在一个运行着的服务器上修改文件时,你应该执行原子操作 。也就是,先写一个临时文件,当写完后再重命名(mv)这个文件到它的最终位置 。许多文本编辑器,cp,tar和其他一些类似程序都不是这样操作的 。这就意味着有机会去访问和(缓存)文件,当这个文件还在被写的情况下 。apc.file_update_protection的设置使得缓存标记新文件的延迟 。默认值是2,意味着如果发现文件的修改时间距离访问时间不到2秒,文件将不会被缓存 。访问写到一半的文件的不幸用户将会看到离奇的情况,但至少这种情况不是持续的 。如果你确信你经常使用原子操作来更新你的文件,你可以关闭这个保护通过设置这个参数为0 。如果你的系统充满io操作,并导致更新程序花费超过2秒,你可能需要去增大这个值 。 apc.enable-cli 整型 大多是为了测试和调试 。为CLI版本的PHP开启动APC功能 。一般来说,你将不会想到为每一个CLI请求创建,移植和放弃APC的缓存,但对于各种测试情况,这是很容易的为了CLI版本开启APC 。 2).使用总结 1,使用Spinlocks锁机制,能够达到最佳性能 。 2,APC提供了apc.php,用于监控与管理APC缓存 。不要忘记修改管理员名和密码 3,APC默认通过mmap匿名映射创建共享内存,缓存对象都存放在这块”大型”的内存空间 。由APC自行管理该共享内存 4,我们需要通过统计调整apc.shm_size、apc.num_files_hints、apc.user_entries_hint的值 。直到最佳 5,好吧,我承认apc.stat = 0 可以获得更佳的性能 。要我做什么都可以接受. 6,PHP预定义常量,可以使用apc_define_constants()函数 。不过据APC开发者介绍说pecl hidef性能更佳,抛异define吧,它是低效的 。 7,函数apc_store(),对于系统设置等PHP变量,生命周期是整个应用(从httpd守护进程直到httpd守护进程关闭),使用APC比Memcached会更好 。必竟不要经过网络传输协议tcp 。 8,APC不适于通过函数apc_store()缓存频繁变更的用户数据,会出现一些奇异现象 。 四、使用实例 复制代码 代码如下: <?php if class Apc{ /** * Apc缓存-设置缓存 * 设置缓存key,value和缓存时间 * @param string $key KEY值 * @param string $value 值 * @param string $time 缓存时间 */ public function set_cache($key, $value, $time = 0) { if ($time == 0) $time = null; //null情况下永久缓存 return apc_store($key, $value, $time);; } /** * Apc缓存-获取缓存 * 通过KEY获取缓存数据 * @param string $key KEY值 */ public function get_cache($key) { return apc_fetch($key); } /** * Apc缓存-清除一个缓存 * 从memcache中删除一条缓存 * @param string $key KEY值 */ public function clear($key) { return apc_delete($key); } /** * Apc缓存-清空所有缓存 * 不建议使用该功能 * @return */ public function clear_all() { apc_clear_cache(user); //清除用户缓存 return apc_clear_cache(); //清楚缓存 } /** * 检查APC缓存是否存在 * @param string $key KEY值 */ public function exists($key) { return apc_exists($key); } /** * 字段自增-用于记数 * @param string $key KEY值 * @param int $step 新增的step值 */ public function inc($key, $step) { return apc_inc($key, (int) $step); } /** * 字段自减-用于记数 * @param string $key KEY值 * @param int $step 新增的step值 */ public function dec($key, $step) { return apc_dec($key, (int) $step); } /** * 返回APC缓存信息 */ public function info() { return apc_cache_info(); } } |