一、APC缓存简介
APC,全称是Alternative PHP Cache,官方翻译叫”可选PHP缓存”。它为我们提供了缓存和优化PHP的中间代码的框架。 APC的缓存分两部分:系统缓存和用户数据缓存。
系统缓存
它是指APC把PHP文件源码的编译结果缓存起来,然后在每次调用时先对比时间标记。如果未过期,则使用缓存的中间代码运行。默认缓存3600s(一小时)。但是这样仍会浪费大量CPU时间。因此可以在php.ini中设置system缓存为永不过期(apc.ttl=0)。不过如果这样设置,改运php代码后需要重启WEB服务器。目前使用较多的是指此类缓存。
用户数据缓存
缓存由用户在编写PHP代码时用apc_store和apc_fetch函数操作读取、写入的。如果数据量不大的话,可以一试。如果数据量大,使用类似memcache此类的更加专著的内存缓存方案会更好
缓存key生成规则
APC的缓存中的每个slot都会有一个key,key是apc_cache_key_t结构体类型,除了key相关的属性,关键是h字段的生成。 h字段决定了此元素落于slots数组的哪一个位置。对于用户缓存和系统缓存,其生成规则不同。 用户缓存通过apc_cache_make_user_key函数生成key。通过用户传递进来的key字符串,依赖PHP内核中的hash函数(PHP的hashtable所使用的hash函数:zend_inline_hash_func),生成h值。
系统缓存通过apc_cache_make_file_key函数生成key。通过APC的配置项apc.stat的开关来区别对待不同的方案。在打开的情况下,即 apc.stat= On 时,如果被更新则自动重新编译和缓存编译后的内容。此时的h值是文件的device和inode相加所得的值。在关闭的情况下,即apc.stat=off时,当文件被修改后,如果要使更新的内容生效,则必须重启Web服务器。此时h值是根据文件的路径地址生成,并且这里的路径是绝对路径。即使你是使用的相对路径,也会查找PG(include_path)定位文件,以取得绝对路径,所以使用绝对路径会跳过检查,可以提高代码的效率。
常用APC设置
apc.cache_by_default | 默认启用缓存。1表示“启用”,0表示“禁用” |
apc.filters | 根据逗号分隔的POSIX正则表达式判断文件需要缓存还是不需要缓存。以a+开头的正则 表达式将强制APC不缓存与此正则表达式匹配的任何文件。以a-开头的正则表达式将强制 APC缓存与此正则表达式匹配的任何文件 |
apc.stat | 启用或禁用APC对于所有请求PHP脚本是否有更改的检查。每次调用脚本时均会执行此 过程。如果禁用该设置,在对PHP脚本进行任意更改后均需要重新启动WEB服务器以 清除缓存并更改脚本内容。0=禁用,1=启用,默认1 |
apc.enabled | 启用或禁用APC缓存。0=禁用,1=启用,默认1 |
apc.shm_size | 设置APC允许使用的共享内存大小,此值以兆字节为单位 |
apc.shm_segments | 设置可用的共享内存段总数 |
apc.include_once_override | 启用或禁用include_once和require_once的优化。启用该设置时,可减少PHP内部函数进行的额外系统调用。0=禁用,1=启用,默认0 |
apc.optimization | 设置优化级别。0=禁用优化功能 |
apc.num_files_hint | 设置你认为需要缓存的文件数。默认值1000,如果不确定文件数,可以设置0 |
apc.ttl | 设置文件存储在缓存中的过期时间,以秒为单位。 |
apc.write_lock | 开启该设置将强制单个进程缓存特定的脚步。适用于必须缓存多个文件的大流量WEB服务器或应用程序 |
以用户缓存为例,apc_add函数用于给APC缓存中添加内容。如果key参数为字符串中,APC会根据此字符串生成key,如果key参数为数组,APC会遍历整个数组,生成key。根据这些key,APC会调用_apc_store将值存储到缓存中。由于这是用户缓存,当前使用的缓存为apc_user_cache。执行写入操作的是apc_cache_make_user_entry函数,其最终调用apc_cache_user_insert执行遍历查询和写入操作。与此对应,系统缓存使用apc_cache_insert执行写入操作,其最终都会调用_apc_cache_insert。
不管是用户缓存还是系统缓存,大体的执行过程类似,步骤如下:
1. 通过求余操作,定位当前key的在slots数组中的位置: cache->slots[key.h % cache->num_slots];
2. 在定位到slots数组中的位置后,遍历当前key对应的slot链表,如果存在slot的key和要写入的key匹配或slot过期,清除当前slot。
3. 在最后一个slot的后面插入新的slot。
二、APC模块安装
A.WINDOWS下安装APC
第一步:下载php_apc.dll 在http://pecl.php.net/package/apc 要与php版本对应 将php_apc.dll放入你的ext目录
第二步:让php.ini支持apc扩展模块。 然后打开php.ini 加入:
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
第一步:下载和安装
wget http://pecl.php.net/get/APC-3.1.8.tgz tar -zxvf APC-3.1.8.tgz cd APC-3.1.8 /usr/local/php/bin/phpize ./configure --enable-apc --enable-mmap --enable-apc-spinlocks --disable-apc-pthreadmutex --with-php-config=/usr/local/php/bin/php-config make sudo make install第二步:配置APC
相关推荐
1、APC缓存简介 APC,全称是Alternative PHP Cache,官方翻译叫”可选PHP缓存”.它为我们提供了缓存和优化PHP的中间代码的框架。 APC的缓存分两部分:系统缓存和用户数据缓存。系统缓存它是指APC把PHP文件源码的编译...
使用APC缓存优化PHP程序
* 缓存抽象类 */ abstract class Cache_Abstract { /** * 读缓存变量 * * @param string $key 缓存下标 * @return mixed */ abstract public function fetch($key); /** * 缓存变量 * * @...
使用APC缓存优化PHP程序
APC编译缓存扩展for php on windows。php_apc-3.1.10-5.3-vc9-x86.zip,内含dll文件。for php5.x
eaccelerator似乎比APC更快,但是,如果你正在运行多个实例的Apache在同一服务器上,你会明白了第二缓存工具 PHP使用. 我使用两个APC及eaccelerator, APC似乎是越来越好,仅在过去3个月内(自01/2006 ) . 注意:在不久的...
一个示例配置可以是在 APC 中缓存“cache”和“cache_bootstrap”,在 Memcached 中缓存“cache_field”和“cache_menu”,以及在数据库中缓存“cache_filter”。 安装 步骤1 像任何其他背景模块一样安装。 有关更...
php 缓存类,支持文件,memcache 和apc 三种形式的插件,解压可用
php缓存技术总结,全静态,部分缓存,数据缓存,查询缓存,内存式缓存,APC缓存,Opcode缓存
一、APC缓存简介APC,全称是Alternative PHP Cache,官方翻译叫”可选PHP缓存”。它为我们提供了缓存和优化PHP的中间代码的框架。 APC的缓存分两部分:系统缓存和用户数据缓存。系统缓存它是指APC把PHP文件源码的编译...
apcu, APCu APC用户缓存 APCuAPCu是用于PHP的内存 key-value 存储。 键的类型为字符串,值可以是任何PHP变量。APCu只支持变量的用户级缓存。APCu的APC删除操作码缓存。 参见 APCu向后兼容模块,它为APC提供了一个...
windows下 php apc的扩展,可以缓存php脚本。非常不错的apc扩展,经本人测试能正常使用
APC全称是Alternative PHP Cache,官方翻译叫”可选PHP缓存 PHP大文件上传文件
记的以前php文件上传到服务器时需要先用zend guard加密下,有了apc就不用了。 从维基百科上看到的消息,apc将被内置在php6中,所以apc还是值的学习下的。 1、安装扩展 在ubuntu 12.04可以直接通过apt-get install ...
从Magento管理面板中的“缓存管理”部分清除APC缓存。
<?php namespace CacheTool; use CacheTool\Code; class CodeTest extends \PHPUnit_Framework_TestCase ... public function testFactory() ...PHPcachetool清除APC_opcode缓存库就是这么一个库。