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 购物车实例(申精)
May 11 PHP
php.ini-dist 和 php.ini-recommended 的区别介绍(方便开发与安全的朋友)
Jul 01 PHP
PHP中一些可以替代正则表达式函数的字符串操作函数
Nov 17 PHP
PHP7.0安装笔记整理
Aug 28 PHP
thinkPHP实现多字段模糊匹配查询的方法
Dec 01 PHP
Win7环境下Apache连接MySQL提示连接已重置的解决办法
May 09 PHP
thinkPHP5 ACL用户权限模块用法详解
May 10 PHP
php实现表单提交上传文件功能
May 28 PHP
PHP基于openssl实现的非对称加密操作示例
Jan 11 PHP
laravel框架模板之公共模板、继承、包含实现方法分析
Aug 30 PHP
PHP PDO和消息队列的个人理解与应用实例分析
Nov 25 PHP
php的RSA加密解密算法原理与用法分析
Jan 23 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
用 PHP5 轻松解析 XML
2006/12/04 PHP
利用PHP生成静态HTML文档的原理
2012/10/29 PHP
CI框架装载器Loader.php源码分析
2014/11/04 PHP
详解Yii2高级版引入bootstrap.js的一个办法
2017/03/21 PHP
php 使用html5 XHR2实现上传文件与进度显示功能示例
2020/03/03 PHP
图片之间的切换
2006/06/26 Javascript
jquery获取颜色在ie和ff下的区别示例介绍
2014/03/28 Javascript
IE6/IE7中JavaScript json提示缺少标识符、字符串或数字问题处理
2014/12/16 Javascript
JavaScript拖拽、碰撞、重力及弹性运动实例分析
2016/01/08 Javascript
js仿淘宝和百度文库的评分功能
2016/05/15 Javascript
简单总结JavaScript中的String字符串类型
2016/05/26 Javascript
由浅入深剖析Angular表单验证
2016/07/14 Javascript
JavaScript实现事件的中断传播和行为阻止方法示例
2017/01/20 Javascript
webpack教程之webpack.config.js配置文件
2017/07/05 Javascript
利用C/C++编写node.js原生模块的方法教程
2017/07/07 Javascript
angularjs路由传值$routeParams详解
2020/09/05 Javascript
微信小程序实现的涂鸦功能示例【附源码下载】
2018/01/12 Javascript
Jquery属性的获取/设置及样式添加/删除操作技巧分析
2019/12/23 jQuery
在vue项目实现一个ctrl+f的搜索功能
2020/02/28 Javascript
解决Ant Design Modal内嵌Form表单initialValue值不动态更新问题
2020/10/29 Javascript
JS创建自定义对象的六种方法总结
2020/12/15 Javascript
[02:12]探秘2016国际邀请赛中国区预选赛选手房间
2016/06/25 DOTA
Python实现把xml或xsl转换为html格式
2015/04/08 Python
Python编程实现控制cmd命令行显示颜色的方法示例
2017/08/14 Python
Python基于动态规划算法解决01背包问题实例
2017/12/06 Python
python+splinter自动刷新抢票功能
2018/09/25 Python
python查看模块,对象的函数方法
2018/10/16 Python
Python WEB应用部署的实现方法
2019/01/02 Python
Python数据可视化教程之Matplotlib实现各种图表实例
2019/01/13 Python
python实现超市商品销售管理系统
2019/10/25 Python
pycharm 设置项目的根目录教程
2020/02/12 Python
Python requests.post方法中data与json参数区别详解
2020/04/30 Python
linux面试题参考答案(10)
2013/11/04 面试题
爱护公物标语
2014/06/24 职场文书
国家领导干部党的群众路线教育实践活动批评与自我批评材料
2014/09/23 职场文书
CSS作用域(样式分割)的使用汇总
2021/11/07 HTML / CSS