+ -
当前位置:首页 → 问答吧 → PHP 缓存技术有哪些?

PHP 缓存技术有哪些?

时间:2010-04-13

来源:互联网



大家用的都有哪些缓存技术,
高手说说,学习
现在用 memcached,,smarty

作者: wlhgbs2008   发布时间: 2010-04-13

中小规模请忘记 memcached,谢谢
找个eAccelerator 常用的应用程序接口(API)回去好好学习吧



eaccelerator_put($key, $value, $ttl=0)
将 $value 存储在共享内存中,并存储 $tll 秒。

eaccelerator_get($key)
从共享内存中返回 eaccelerator_put() 函数所存储的缓存数值,如果不存在或者已经
过期,则返回 null。

eaccelerator_rm($key)
从共享内存中删除 $key。

eaccelerator_gc()
删除所有过期的键(keys)

eaccelerator_lock($lock)
创建一个指定名称的锁(lock)。该锁可以通过 eaccelerator_unlock() 函数解除,在请求
结束时也会自动解锁。例如:
<?php
eaccelerator_lock("count");
eaccelerator_put("count",eaccelerator_get("count")+1));
?>

eaccelerator_unlock($lock)
解除指定名称的锁(lock)。

eaccelerator_set_session_handlers()
安装 eAccelerator session 句柄。
从 PHP 4.2.0 以后,您可以通过设置 php.ini 中的 "session.save_handler=eaacelerator"
安装 eAccelerator 句柄。

eaccelerator_cache_output($key, $eval_code, $ttl=0)
在共享内存中缓存 $eval_code 的输出,缓存 $ttl 秒。
可以调用 mmcach_rm() 函数删除相同 $key 的输出。例如:
<?php eaccelerator_cache_output('test', 'echo time(); phpinfo();', 30); ?>

eaccelerator_cache_result($key, $eval_code, $ttl=0)
在共享内存中缓存 $eval_code 的结果,缓存 $ttl 秒。
可以调用 mmcach_rm() 函数删除相同 $key 的结果。例如:
<?php eaccelerator_cache_output('test', 'time()." Hello";', 30); ?>

eaccelerator_cache_page($key, $ttl=0)
缓存整个页面,且缓存 $ttl 秒。例如:
<?php
eaccelerator_cache_page($_SERVER['PHP_SELF'].'?GET='.serialize($_GET),30);
echo time();
phpinfo();
?>

eaccelerator_rm_page($key)
从缓存中删除由 eaccelerator_cache_page() 函数创建的相同 $key 的页。

eaccelerator_encode($filename)
返回 $filename 文件经过编译后的编码。

eaccelerator_load($code)
加载被 eaccelerator_encode() 函数编码过的脚本。

作者: bs   发布时间: 2010-04-13

回复 bs


    谢谢大牛

作者: wlhgbs2008   发布时间: 2010-04-14

{:6_353:}

作者: thizluo   发布时间: 2010-05-20

请问 ,eaccelerator 也是基于内存的吗?

作者: garygay   发布时间: 2010-05-20

http://www.phpig.net/showthread.php?tid=127

你可以看看这篇文章,看DISCUZ X 有什么缓存技术

作者: garygay   发布时间: 2010-05-20

smarty是文件缓存,在读静态的html.

作者: zl8522115   发布时间: 2010-05-21

常见有三种缓存技术
1,缓存数据库结果,对短时间内改动不大的数据库查询结果进行缓存,按保存方式又可以分成其他的,比如保存在内存中(比如memcache),缓存在文件中等等,
2,缓存代码,使用模板引擎机制常用的方法,像你提到的smarty模板引擎,在模板变成可直接运行的php代码这个过程叫解析,如果模板不发生改变,每次执行都要解析一次,浪费,可以缓存解析后的代码,下次就不用解析了,
3,缓存‘中间代码’(其实我不知道怎么叫),php是用c编译的,最后还是编译成C来执行,同上,如果php代码改动不大,直接缓存已经编译后的c代码,执行效率就高了,这个鸟哥博客好像有提到,叫o。。。什么代码。。。
还有很多其他的,我还没整明白。高手补充。

作者: 只是彼岸花   发布时间: 2010-05-21

看我两年前写的:
http://bbs.phpchina.com/thread-71826-1-1.html

虽然不详细,不完整,凑合着看吧。

作者: stylecn   发布时间: 2010-05-22

存储介质上:
服务器端的文件缓存,内存缓存,数据库缓存,输出缓存客户端的浏览器缓存

缓存颗粒:
粒状缓存,块状缓存,这两者结合可以灵活的构建全站缓存,或者局部功能模块缓存

缓存用途:
SQL缓存,opcode,反向代理,浏览器缓存,长连接,模板页面缓存,JavaScript/CSS的动态化缓存,频繁资源缓存等等

从某种意义上,可以说大部分的优化都是围绕缓存进行的

作者: 7u5   发布时间: 2010-05-22

再次声明一下,如果你的代码在本地磁盘上,且又将缓存放在本地磁盘("文件缓存"),那么其根本不能称之为缓存
缓存的意义在于让数据源离CPU更近且一般具有时效性(非持久),而不是偷换概念.

如果DISCUZ的文件"缓存"方式算缓存,那么这世界上基本没什么不算缓存了,并不是说DISCUZ这样不好,它具备了缓存的理念,但是直接称之为"缓存"就不太靠谱了,你可以叫它代码"预处理",而新手不可盲从.

想更多争议查看  http://bbs.phpchina.com/viewthread.php?tid=134159

作者: bs   发布时间: 2010-05-22

我觉得从缓存的英文本意cache来理解,也许楼上会赞同。另外一个帖子,有相关的引用与翻译解释http://bbs.phpchina.com/viewthread.php?tid=134159&page=9&extra=#pid1505429
不过我并不想否认你的观点。

我先说说自己的看法,cache本意是快速缓冲贮存区,一般般意义上是用性能更快的介质来存储部分常用的数据或指令,这里如果命中率比较高,则提速非常明显,否则没意义。

这里强调的是硬件,但在从计算机科学的角度来看,硬件和软件其实在性能本质上,趋于近似。

所以,我认为把数据源获取及处理,并存储在硬盘里(文件),也算一种缓存。
因为实际上,一个查询费时良久,取出的只是其中的若干条数据。
把这个过程预处理再存储起来就是一种缓存。一个用介质实现速度提升,一个用预处理方式实现速度提升。

“预处理”,我觉得bs的描述说透了这种机制的核心实现,但是问题是,这里并不仅仅是预处理而已,cache的另外一个概念是“缓冲”,即把低速运算与高并发所要求高性能矛盾进行缓和处理。

至于时效性,文件缓存也有时效性,就是数据源更改后,该缓存过期,只是Discuz延后统一处理,而不是立即更新。

而且,这个文件解决了另外一个问题,就是中间算法开销的问题。
而memcached需要提供的中间算法开销有两个方面:
1。 哈希算法的计算,这点可以忽略不计。
2。 分布式集群管理运算开销,类似DBMS的。

当然memcached仍然是高效的,这两方面开销都不算大,但并不是不存在。

作者: 7u5   发布时间: 2010-05-22

嗯,即使正如你所说的介质理解问题,但你必须承认一旦撇开Discuz降低计算的环节,这个"缓存"将变得毫无意义。

作者: bs   发布时间: 2010-05-22

浏览器缓存可以玩玩 这个比较好实现,虽然效果提升不明显

作者: 那个故事   发布时间: 2010-05-22

我觉得从缓存的英文本意cache来理解,也许楼上会赞同。另外一个帖子,有相关的引用与翻译解释
不过我并不想 ...
7u5 发表于 2010-5-22 18:43


我的意见和你一致。
抛开专业术语,用户常见缓存之词,应当是IE缓存吧。不管你愿不愿意,这个的确叫“缓存”。
按我理解,缓存的目的是为了改善速度和性能,并不仅限于CPU。预读取或者说预处理恰恰是缓存的具体体现。
至于存储介质,我觉得不必介意,当硬盘比光盘的处理速度更快时,把缓存数据放在硬盘上也可以认为是缓存的体现。
不能因为网络比硬盘慢,硬盘比内存慢,内存比CPU慢就不承认其它缓存存储介质。

至于时效性,我认为这和缓存没有关系。这是系统设计问题,而不是缓存概念的一部分。

作者: stylecn   发布时间: 2010-05-24

memcached
cdn
f5

作者: miduo   发布时间: 2010-05-25

DZ 其实就是不光取出数据 还进行了一些处理。这个处理也很占时间的吧。

作者: clackroal   发布时间: 2010-05-25

至于时效性,我认为这和缓存没有关系。这是系统设计问题,而不是缓存概念的一部分。
stylecn 发表于 2010-5-24 11:12

此言差矣,没有时效性的"缓存"通常叫数据镜像/幅本技术是严谨的,笼统起来那叫艺术

作者: bs   发布时间: 2010-05-25

回复 bs

ZF里面的文件形式算不算缓存呢?把数据都放到了文件里面


$cache = Zend_Cache::factory('Core',
                             'File',
                             $frontendOptions,
                             $backendOptions);

作者: wlhgbs2008   发布时间: 2010-06-17

学习了~~~

作者: hlsblog   发布时间: 2010-07-26