Zend Framework Cache常用代码实例

简介:

Zend Framework中有3种常用的前端类,分别是

Zend_Cache_Core

Zend_Cache_Frontend_Output

Zend_Cache_Frontend_Page

与之对应的ASP.NET中的概念分别是数据缓存,片段缓存,页面缓存。

其中Zend_Cache_Frontend_Output和Zend_Cache_Frontend_Page都继承了Zend_Cache_Core。

在创建缓存的时候,对应的代码如下,这些代码一般写在资源方法中,Bootstrap.php文件内。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
if  (false == Zend_Registry::isRegistered( 'coreCache' )) {
     $frontendOptions  array (
             'lifetime'  => 10,
             'automatic_serialization'  => true
     );
                 
     $backendOptions  array (
             'cache_dir'  => APPLICATION_PATH .  '/tmp'
     );
                 
     $core_cache  = Zend_Cache::factory( 'Core' 'File' $frontendOptions ,
             $backendOptions );
     Zend_Registry::set( 'coreCache' $core_cache );
}


1
2
3
4
5
6
7
8
9
10
11
12
13
if  (false == Zend_Registry::isRegistered( 'outputCache' )) {
     $frontendOptions  array (
             'lifetime'  => 10
     );
               
     $backendOptions  array (
             'cache_dir'  => APPLICATION_PATH .  '/tmp'
     );
               
     $output_cache  = Zend_Cache::factory( 'Output' 'File' ,
             $frontendOptions $backendOptions );
     Zend_Registry::set( 'outputCache' $output_cache );
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
if  (false == Zend_Registry::isRegistered( 'pageCache' )) {
     $frontendOptions  array (
             'lifetime'  => 4
     )
     ;
             
     $backendOptions  array (
             'cache_dir'  => APPLICATION_PATH .  '/tmp'
     );
             
     $page_cache  = Zend_Cache::factory( 'Page' 'File' $frontendOptions ,
             $backendOptions );
     Zend_Registry::set( 'pageCache' $page_cache );
}

Zend_Cache_Core主要用来缓存数据。比如数组,字符串之类的。类似ASP.NET中的数据缓存。下面的代码演示如何用缓存。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
try  {
             $core_cache  = Zend_Registry::get( 'coreCache' );
             $z_now  = Zend_Date::now();
             if  (! $result  $core_cache ->load( "now" ))  // 缓存未命中
             {
                 echo  "缓存未命中<br>" ;
                 $core_cache ->save( $z_now "now" ); //加入缓存
                 echo  $z_now ;
             else  {
                 echo  "缓存命中<br>" ;
                 echo  $result ;
             }
         catch  (Exception  $e ) {
echo  $e ->getMessage();
         }

初次打开页面,由于没有缓存,因此缓存未命中,把当前时间加入缓存中。然后刷新页面,缓存已经有了,直接读缓存,因此会发现时间不变。

当10秒后缓存失效,缓存又未命中了。

Zend_Cache_Frontend_Output继承了Zend_Cache_Core,因此上述的缓存数据的方法,它也可以使用。

同时它是一个输出捕捉前端.它在PHP中使用输出缓冲捕获start() 和 end() 方法间的一切输出. 类似于ASP.NET中的片段缓存。看如下示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
try  {
             $output_cache  = Zend_Registry::get( 'outputCache' );
             if  (!( $output_cache ->start( 'myoutput' ))) {
                 echo  Zend_Date::now();
                 $output_cache -> end ();  // output buffering ends
                 echo  "缓存未命中" ;
             }
            echo  "<br>当前时间为:" ;
            echo  Zend_Date::now();
         catch  (Exception  $e ) {
echo  $e ->getMessage();
         }

$output_cache->start('myoutput') 这句话,如果已经有了myoutput这个缓存的话,也就是说start方法返回的是true的话,则if里面的语句运行了。直接把myoutput这个缓存的内容输出一遍。否则,重新记录一遍myoutput缓存,缓存的内容就是送start到end之间的内容。发送缓存记录后,后续的代码继续运行下去。

Zend_Cache_Frontend_Page同样继承了Zend_Cache_Core,它和Zend_Cache_Frontend_Output类似,但不同的是,它不是缓存单一的数据片断,而是缓存整个页面。因此它只有start方法,没有end方法,或者说当程序运行完,会自动的运行end方法。使用更简单,只需要代码如下:

1
2
3
4
5
6
7
try  {
     $page_cache  = Zend_Registry::get( 'pageCache' );
     $page_cache ->start();
     echo  Zend_Date::now();
catch  (Exception  $e ) {
     echo  $e ->getMessage();
}

首次的时候,会把start方法后面的输出都会缓存起来。下次运行的时候,缓存命中的话,就直接发送缓存,而不执行下面的语句了。如果后续的语句是数据库中的数据,则会节省了数据库读取操作。提升了效率。

















本文转自cnn23711151CTO博客,原文链接: http://blog.51cto.com/cnn237111/1300904,如需转载请自行联系原作者


相关文章
|
6月前
|
存储 缓存 PHP
深入PHP内核:理解Zend Engine与Opcode缓存
【5月更文挑战第30天】 在PHP的开发世界中,性能优化是一个永恒的话题。随着现代Web应用的复杂性日益增加,仅仅依靠代码层面的优化已经远远不够。本文将深入探讨PHP的执行心脏——Zend Engine,以及如何通过Opcode缓存机制提升PHP应用的执行效率。我们将透过对Zend Engine工作原理的分析,了解Opcode缓存的实现原理,并通过实例来展示其对性能提升的显著影响。
|
自然语言处理 PHP
Zend 引擎首先将 PHP 代码编译为中间代码,中间代码是干什么的?底层原理是什么?
Zend 引擎首先将 PHP 代码编译为中间代码,中间代码是干什么的?底层原理是什么?
152 0
PHP的spl_autoload_register()函数是干什么的?底层原理是什么?
PHP的spl_autoload_register()函数是干什么的?底层原理是什么?
137 0
|
Web App开发 PHP
php runtime 中 headers already sent 问题解决方案
本文旨在梳理 Cannot modify header information - headers already sent by (output started at xx 问题的原因,触发条件以及相应的解法
18473 1
|
前端开发 PHP Apache