PHP之APC缓存详细介绍 apc模块安装


Posted in PHP onJanuary 13, 2014

1、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_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.
不管是用户缓存还是系统缓存,大体的执行过程类似,步骤如下:
通过求余操作,定位当前key的在slots数组中的位置: cache->slots[key.h % cache->num_slots];
在定位到slots数组中的位置后,遍历当前key对应的slot链表,如果存在slot的key和要写入的key匹配或slot过期,清除当前slot.
在最后一个slot的后面插入新的slot.

2、APC模块安装

WINDOWS

第一步:下载php_apc.dll 在/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 PHP APC 配置参数 把相关的配置放在一起解释。

apc.enabled=1 apc.enabled默认值是1,你可设成0禁用APC.如果你设置为0的时候,同样把extension=apc.so也注释掉(这样可以节约内存资源)。一旦启用了APC功能,则会缓存Opcodes到共享内存。
apc.shm_segments = 1

总结 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()缓存频繁变更的用户数据,会出现一些奇异现象。

LIUNX

wget 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
在/usr/local/php/etc/php.ini 加入
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

PHP 相关文章推荐
php实现的MySQL通用查询程序
Mar 11 PHP
PHP-MySQL教程归纳总结
Jun 07 PHP
php数组函数序列之prev() - 移动数组内部指针到上一个元素的位置,并返回该元素值
Oct 31 PHP
php利用腾讯ip分享计划获取地理位置示例分享
Jan 20 PHP
Yii操作数据库的3种方法
Mar 11 PHP
PHP获取客户端真实IP地址的5种情况分析和实现代码
Jul 08 PHP
php返回字符串中所有单词的方法
Mar 09 PHP
php查询相似度最高的字符串的方法
Mar 12 PHP
thinkPHP导出csv文件及用表格输出excel的方法
Dec 30 PHP
php set_include_path函数设置 include_path 配置选项
Oct 30 PHP
PHP严重致命错误处理:php Fatal error: Cannot redeclare class or function
Feb 05 PHP
YII框架页面缓存操作示例
Apr 29 PHP
PHP curl 获取响应的状态码的方法
Jan 13 #PHP
PHP上传图片进行等比缩放可增加水印功能
Jan 13 #PHP
php网站地图生成类示例
Jan 13 #PHP
php防止sql注入示例分析和几种常见攻击正则表达式
Jan 12 #PHP
php中文验证码实现示例分享
Jan 12 #PHP
PHP 下载文件时自动添加bom头的方法实例
Jan 10 #PHP
php环境下利用session防止页面重复刷新的具体实现
Jan 09 #PHP
You might like
使用PHP获取当前url路径的函数以及服务器变量
2013/06/29 PHP
PHP实现的分页类定义与用法示例
2017/07/05 PHP
javascript管中窥豹 形参与实参浅析
2011/12/17 Javascript
JavaScript等比例缩放图片控制超出范围的图片
2013/08/06 Javascript
由点击页面其它地方隐藏div所想到的jQuery的delegate
2013/08/29 Javascript
DOM 事件流详解
2015/01/20 Javascript
浅谈js中变量初始化
2015/02/03 Javascript
JS解析XML文件和XML字符串详解
2015/04/17 Javascript
jquery实现未经美化的简洁TAB菜单效果
2015/08/28 Javascript
Jsonp 关键字详解及json和jsonp的区别,ajax和jsonp的区别
2015/12/30 Javascript
JS在一定时间内跳转页面及各种刷新页面的实现方法
2016/05/26 Javascript
jQuery图片轮播(二)利用构造函数和原型创建对象以实现继承
2016/12/06 Javascript
推荐三款不错的图片压缩上传插件(webuploader、localResizeIMG4、LUploader)
2017/04/21 Javascript
关于JavaScript中forEach和each用法浅析
2017/07/27 Javascript
深入理解Vue生命周期、手动挂载及挂载子组件
2017/09/27 Javascript
jQuery+SpringMVC中的复选框选择与传值实例
2018/01/08 jQuery
node.js调用C++函数的方法示例
2018/09/21 Javascript
通过原生vue添加滚动加载更多功能
2019/11/21 Javascript
Vue Cli3 打包配置并自动忽略console.log语句的方法
2020/04/23 Javascript
Vue触发input选取文件点击事件操作
2020/08/07 Javascript
Vue中引入svg图标的两种方式
2021/01/14 Vue.js
[01:36:57]【09DOTA2第一视角】小骷髅
2014/04/16 DOTA
[51:39]DOTA2-DPC中国联赛 正赛 Magma vs LBZS BO3 第二场 2月7日
2021/03/11 DOTA
python 3.6 +pyMysql 操作mysql数据库(实例讲解)
2017/12/20 Python
python3.4实现邮件发送功能
2018/05/28 Python
python绘制简单彩虹图
2018/11/19 Python
详解python3 + Scrapy爬虫学习之创建项目
2019/04/12 Python
python中p-value的实现方式
2019/12/16 Python
python Django 反向访问器的外键冲突解决
2020/05/20 Python
东芝官网商城:还原日式美学,打造美好生活
2018/12/27 全球购物
幼儿园消防安全制度
2014/01/26 职场文书
买房委托公证书
2014/04/08 职场文书
2016年大学自主招生自荐信范文
2015/03/24 职场文书
OpenCV 图像梯度的实现方法
2021/07/25 Python
Linux安装apache服务器的配置过程
2021/11/27 Servers
《地。-关于地球的运动-》单行本第七集上市,小说家朝井辽献上期待又害怕的推荐文
2022/03/31 日漫