PHP缓存技术

缓存,顾名思义,就是临时存储信息以提高访问性能。PHP的缓存技术大体可分为三大类:

1. 缓存内容(Caching content)

2. 内存缓存(Memory Cache)

3. 数据库缓存(Database Cache)

1. 缓存内容

将某个脚本的最终输出作为静态文件存放在文件系统中,比如👤信息,商品显示页,当数据库内容被修改或文件过期时,重新执行原始脚本以更新缓存内容。简单示例如下:

内容缓存是最为常见的,比如输出缓存ob_start,页面部分缓存ob_get_contents,甚至数据库某些查询结果的缓存。

2. 内存缓存

顾名思义,通过内存进行缓存,显然会比缓存在文件系统中快出许多,常见的技术如下:

Opcode Cache

简要介绍下PHP的运行机制:a)子进程解释器解析php脚本,比如Zend Complier; b)zend_language_scanner会首先对代码进行扫描,将PHP代码进行词法分析,转化为一系列的token array;c)zend_language_parse将上一步产生的一系列token处理空格等无用的代码后转化成一系列表达式;d)这些表达式经过complier阶段生成opcode【即Operation code,是一个四元组(opcode,op1,op2,result)】并返回zend_op_array指针;e)zend_vm_execute根据传入的zend_op_array指针,执行opcode并将结果返回输出;

对opcode进行缓存的软件很多,比如apc,eAcclerator,Xcache,Zend Platform,这里主要介绍下apc;

APC提供了两种缓存功能:缓存Opcode(目标文件),即apc_complier_cache,缓存用户数据即apc_user_cache. 下图为使用了apc_complier_cache后的php解析过程:

由于apc并未内置到PHP解释器内核中,你需要单独安装并在php.ini中添加apc配置:

apc的使用是比较简单的,主要比较常用的有三个方法:

apc_add/apc_store– store a variable in the cache. The only difference betweenapc_addandapc_storeis thatapc_storeoverwrites the data if it already exists andapc_adddoes not。

apc_fetch– fetch a variable from the cache

apc_delete– delete a variable from the cache.

http://www.360doc.com/content/16/0204/17/22355405_532718314.shtml

据说apc使用了spinlocks(自旋)锁机制,能够达到最佳性能,但这也可能会死锁,进而影响到php-fpm进程(https://yq.aliyun.com/articles/1699);

一方面apc_store对于系统设置等PHP变量的缓存是比较好的选择,但apc不合适通过apc_store频繁变更用户数据,会出现一些奇异现象;

Memcache

分布式对象缓存系统,通过在内存中以键值对的形式缓存数据和对象以减少读取数据库的次数,进而提高驱动网站的速度。它可以应对任意多个连接,使用非阻塞的网络IO。

Memcache与memcached区别:Memcache是项目名称,而memcached是项目在服务器段的主程序文件名;

所谓的分布式对象缓存体现,单个服务器就算了,比如现memcache客户端要添加“shanghai”,客户端根据查询算法(比如Consistent hashing根据“键”来决定保存数据的memcached服务器。至于memcache服务器端,它会在内存中开辟一块空间,然后建立一个HashTable, 并复制管理维护。“shanghai”到了选定的服务器后,将“shanghai”维护到HashTable,并在内存中保存其值。

同样在获取保存的数据时,比如键值“hangzhou”,memcache客户端会通过相同的方式,根据键值选择服务器,然后发送get命令取得value,当然若不幸该键值尚不存在或已失效,那就从元数据取之并reset。这样键值对通过HashTable存储到不同的服务器上,就实现了memcached的分布式。

注意:查询算法因节点分布不均而造成的数据倾斜问题,memcache服务器增多是否会影响键值的重新分布以及增减服务器是否会导致缓存的大范围丢失。

Memcache区分为memcache服务器端的安装和memcache客户端安装,默认端口号11211。简单示例如下:

既然是缓存,定是有过期时间的,比如上述图片中set('things',$things,false,86400),对memcache而言,它不会在过期监视上耗费CPU时间,当某个值过期后,其内存并没有被删除,而是当再次在get时查看记录的时间戳,检查记录是否过期,如果已过期,则返回空并且清空,这种技术被称为lazy(惰性)expiration。

另外,memcache会优先使用已超时记录的空间,但即使如此,也会发生追加新纪录时空间不足的情况,此时就要使用Least Recently Used(LRU)机制来分配空间【即使某个key设置的是永久有效期】。

对于分布式的对象缓存系统memcache,其须以root权限运行,且访问是无用户状态的,考虑到安全性,一般通过放在内网,并通过防火墙限制外网访问memcache端口达到安全。

数据库缓存

上述的缓存技术都是在应用层讨论的,database server本身也可以cache,典型的就是SQL第一次查询时解析,后续查询则直接从database server cache中获取结果。简单config MySQL my.cnf如下:

query_cache_type =1

query_cache_limit = 1M

query_cache_size =16M

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,165评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,503评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,295评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,589评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,439评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,342评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,749评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,397评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,700评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,740评论 2 313
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,523评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,364评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,755评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,024评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,297评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,721评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,918评论 2 336

推荐阅读更多精彩内容