Zend_Cache-Introduction.xml 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. <sect1 id="zend.cache.introduction">
  2. <title>简介</title>
  3. <para>
  4. <code>Zend_Cache</code> 提供了一个缓存任何数据的一般方法.
  5. </para>
  6. <para>
  7. 在Zend Framework中缓存由前端操作,同时通过后端适配器(<code>File</code>, <code>Sqlite</code>, <code>Memcache</code>...)和
  8. 一个灵活的IDs和Tags系统(标识符和标记系统)存储缓存纪录.使用此方法,易于删除特定类型的纪录(例如:"删除所有标记为tag的纪录")
  9. </para>
  10. <para>
  11. 模块(<code>Zend_Cache_Core</code>) 的核心是通用,灵活和可配置.对于特定的需要,为了便捷,这里有一些继承自<code>Zend_Cache_Core</code>的前端:
  12. <code>Output</code>, <code>File</code>, <code>Function</code> 和 <code>Class</code>.
  13. </para>
  14. <example id="zend.cache.introduction.example-1">
  15. <title>调用 <code>Zend_Cache::factory()</code>取得一个前端</title>
  16. <para>
  17. <code>Zend_Cache::factory()</code> 实例化正确的对象并把他们捆绑到一起.
  18. 在这第一个例子中我们将把 <code>Core</code> 前端和 <code>File</code> 后端一起使用.
  19. </para>
  20. <programlisting role="php"><![CDATA[
  21. $frontendOptions = array(
  22. 'lifeTime' => 7200, // 两小时的缓存生命期
  23. 'automatic_serialization' => true
  24. );
  25. $backendOptions = array(
  26. 'cache_dir' => './tmp/' // 放缓存文件的目录
  27. );
  28. // 取得一个Zend_Cache_Core 对象
  29. $cache = Zend_Cache::factory('Core',
  30. 'File',
  31. $frontendOptions,
  32. $backendOptions);
  33. ]]>
  34. </programlisting>
  35. </example>
  36. <note>
  37. <title>由多个字组成的前端和后端</title>
  38. <para>
  39. 一些前端和后端使用多个字命名,例如'ZendPlatform'.当指定给工厂时,使用字分隔符,比如空格(' '),连字符('-'),或则点('.').
  40. </para>
  41. </note>
  42. <example id="zend.cache.introduction.example-2">
  43. <title>Caching a database query result</title>
  44. <para>
  45. 现在有了一个前端,可用缓存任何类型的数据了(开了序列化'serialization').例如,能够缓存从昂贵的数据库查询中缓存一个结果.结果被缓存后,不再需要连接到数据库;数据直接在缓存中取回和反序列化.
  46. </para>
  47. <programlisting role="php"><![CDATA[
  48. // $cache 在先前的例子中已经初始化了
  49. // 查看一个缓存是否存在:
  50. if(!$result = $cache->load('myresult')) {
  51. // 缓存不命中;连接到数据库
  52. $db = Zend_Db::factory( [...] );
  53. $result = $db->fetchAll('SELECT * FROM huge_table');
  54. $cache->save($result, 'myresult');
  55. } else {
  56. // cache hit! shout so that we know
  57. echo "This one is from cache!\n\n";
  58. }
  59. print_r($result);
  60. ]]>
  61. </programlisting>
  62. </example>
  63. <example id="zend.cache.introduction.example-3">
  64. <title>用<code>Zend_Cache</code> 输出前端缓存输出</title>
  65. <para>
  66. 通过加入条件逻辑,我们'mark up'(标记)那些希望缓存输出的段(sections),在<code>start()</code> 和 <code>end()</code>方法间封装这些section(这类似第一个例子,并且是缓存的核心策略).
  67. </para><para>
  68. 在内部,像往常一样输出你的数据,当执行到<code>end()</code>方法时,所有之前的输出都被缓存.在下一次运行时,整个段(end()方法调用前的代码)将被跳过执行,直接从Cache中取回数据(只要缓存纪录是有效的).
  69. </para>
  70. <programlisting role="php"><![CDATA[
  71. $frontendOptions = array(
  72. 'lifeTime' => 30, // cache lifetime of 30 seconds
  73. 'automatic_serialization' => false // this is the default anyway s
  74. );
  75. // 翻译时实验系统为Windows,请使用Windows的读者修改cacheDir的路径为实际的路径
  76. $backendOptions = array('cache_dir' => './tmp/');
  77. $cache = Zend_Cache::factory('Output',
  78. 'File',
  79. $frontendOptions,
  80. $backendOptions);
  81. // 传递一个唯一标识符给start()方法
  82. if(!$cache->start('mypage')) {
  83. // output as usual:
  84. echo 'Hello world! ';
  85. echo 'This is cached ('.time().') ';
  86. $cache->end(); // the output is saved and sent to the browser
  87. }
  88. echo 'This is never cached ('.time().').';
  89. ]]>
  90. </programlisting>
  91. <para>
  92. 注意我们两次输出了<code>time()</code>的结果;为演示目的第二次的time()调用是动态的.再运行然后刷新多次;你会注意到当随着时间的流逝第一个数字并没有随时间改变.这是因为第一个数组在缓存段中输出,因此输出是被缓存了.
  93. 30秒后(我们设置了lifetime为30秒)由于缓存纪录超时而变得无效了,第一个数字再次更新,同时于第二个时间匹配(相同).你应该在你的浏览器或者控制台中试一下.
  94. </para>
  95. </example>
  96. <note><para>
  97. 在使用Zend_Cache是特别要注意的Cache标识(传递给<code>save()</code>和<code>start()</code>的参数).它必须对于你所缓存的每个资源唯一,否则不相关的缓存纪录就会相互覆盖,
  98. 更糟的是,导致错误的显示结果.
  99. </para></note>
  100. </sect1>
  101. <!--
  102. vim:se ts=4 sw=4 et:
  103. -->