2008-12-26

symfony缓存(cache)机制简介

类归于: symfony — 标签:, , kthiz2006 @ 10:32

关于缓存

symfony可以处理三种不同类型的html缓存:

  1. 动作的缓存(包含或不包含布局)
  2. 局部模板,组件或组件槽的缓存
  3. 模板片段的缓存

全局缓存设置
在项目的配置目录下:
例:

dev:
.settings:
cache: on

首先缓存一个动作:
例如在fontend/modules/shop/config/cache.yml(如果该文件不存在,就创建它)里写如下

list:
enabled: on        #开启缓存
with_layout: false #设置是否布局一起被缓存
lifetime: 86400    #设置缓存时间

这时就可以在dev下测试缓存的设置。

如果动作里的参数不一样,则在缓存中会根据参数的不同存入相应的记录。

缓存局部模板,组件或组件槽
例如在fontend/modules/shop/config/cache.yml里下如下

_my_partial:
contextual: true #如果把每个调用它的模板都保存一个版本,则设为true
enable: on

模板缓存片段
例如:
<!– Code executed each time –>

<?php echo link_to('last accessed user', 'user/show?id='.$last_accessed_user_id) ?>

<!– Cached code –>

<?php if (!cache('users')):
foreach ($users as $user):
echo $user->getName() ;
endforeach;
cache_save() ;
 endif; ?>

动态配置缓存

$context->getViewCacheManager()->addCache('article', 'show', array(
'withLayout' => true,
'lifeTime'   => 3600,
));

删除缓存的命令:
1.删除整个缓存
symfony clear:cache (简写 php symfony cc)
2.仅删除前台应用的缓存
php symfony cache:clear –app=frontend
3.仅删除前台应用的HTML缓存
php symfony cache:clear –app=frontend –type=template
4.仅删除前台应用的配置缓存
php symfony cache:clear –app=frontend –type=config
5.仅删除前台应用的发布模式下的配置缓存
php symfony cache:clear –app=frontend –type=config –env=prod

用$this->getContext()->getViewCacheManager()->remove()删除指定缓存.
用sfToolkit::clearGlob()方法删除指定缓存所在的目录。
例如:

<?php
$sf_root_cache_dir = sfConfig::get('sf_cache_dir');
$cache_dir = $sf_root_cache_dir.'/frontend/cache/*';#清楚前台缓存目录
sfToolkit::clearGlob($cache_dir);
?>

下面举例个例子:

首先拷贝一个frontend_dev.php改名为frontend_cache.php,里面内容改为如下:

<?php
require_once(dirname(__FILE__).'/../config/ProjectConfiguration.class.php');

$configuration = ProjectConfiguration::getApplicationConfiguration('frontend', 'cache', true);
sfContext::createInstance($configuration)->dispatch();
?>

然后在apps/frontend/config/settings.yml里设置

cache:
.settings:
error_reporting: <?php echo (E_ALL | E_STRICT)."n" ?>
web_debug:       on
cache:           on
etag:            off

接着在config/databases.yml里写

cache:
propel:
class: sfPropelDatabase
param:
classname: DebugPDO

然后清楚缓存。

接着在apps/frontend/config/cache.yml下写

default:
enabled:     off
with_layout: false
lifetime:    86400

然后在apps/frontend/modules/shop/config/cache.yml(注:config目录如果不存在则创建它)下写

index:
enabled:     on
with_layout: true

清除缓存

这样刷新页面,就可以在shop的index页面看到红色边框,和蓝色的小框,刷新页面,蓝色变成黄色。可以看时间感受一下缓存后的速度。

这时如果想删除前台的整个缓存可以使用如下方法

<?php
$sf_root_cache_dir = sfConfig::get('sf_cache_dir');
$cache_dir = $sf_root_cache_dir.'/frontend/cache/*';#清楚前台缓存目录
sfToolkit::clearGlob($cache_dir);
?>

也可以用

<?php
$sf_root_cache_dir = sfConfig::get('sf_cache_dir');
$cache_dir = $sf_root_cache_dir.'/frontend'; #清楚前台缓存目录
sfToolkit::clearDirectory($cache_dir);
?>

这样缓存就被清除了。

HTTP1.1与客户端缓存
目前浏览器都支持http1.1(即使不支持也没关系)
增加ETag头信息来避免发送重复的内容(作用是当开启该功能后,服务器会增加一个含有响应本身签名的专门的头部。用户的浏览器会把它保存下来,代下次请求
的时候把这个签名一起发出去。如果与新签名一致,则服务器不会发出响应,而是发出一个没有修改的头信息。这样就节省了服务器的CPU时间和带宽,还有客户端的时间)
例如:在settings.yml里设置开启ETag功能.

all:
.settings:
etag: on
(注:默认是开启的)

增加Last-Modified头信息避免发送仍然有效的内容
服务器向浏览器发送响应的时候,会增加一个头部说明页面的数据的最后修改时间。
浏览器理解这个信息,当再次请求这个页面的时候,会对应的加上If-Modified
这样服务器可以比较客户端和应用程序返回的这个值,如果相同,则返回没有修改的头信息。这样可以节约带宽和CPU时间。
当然在symfony可以手动设置时间
例如:

<?php $this->getResponse()->setHttpHeader('Last-Modified', $this->getResponse()->getDate($timestamp));?>

通过增加Vary头信息保存一个页面的多个缓存版本,但这会增加缓存的大小,不过,服务器收到匹配的头信息的时候,就可以直接从缓存里取出响应而无须处理。
例如:

<?php
$this->getResponse()->addVaryHttpHeader('Cookie');
$this->getResponse()->addVaryHttpHeader('User-Agent');
$this->getResponse()->addVaryHttpHeader('Accept-Language');
?>

通过增加Cache-Control头信息来允许客户端缓存
例如:
可以定义缓存的时间

<?php $this->getResponse()->addCacheControlHttpHeader('max_age=60');?>

指定页面的缓存的条件

<?php $this->getResponse()->addCacheControlHttpHeader('private=True');?>

设置过期时间

<?php $this->getResponse()->setHttpHeader('Expires', $this->getResponse()->getDate($timestamp));?>

使用数据库存储系统进行缓存(好处是当应用程序的缓存压力非常大时,模板的缓存文件最终会分散在很深的文件结构中,在这种情况下用sqlite存储会更快。清除缓存过程将只是一个简单的文件删除)
首先查看php的扩展是否支持sqlite,如果不支持,请安装它.
安装好后,在应用程序的config里的factories.yml的all下面添加如下:

<?php
all:
  view_cache:
    class: sfSQLiteCache
    param:
      database: %SF_TEMPLATE_CACHE_DIR%/cache.db
?>

最后清缓存.
这样,就在你为应用程序的开启缓存的模式下启用了。

评论暂缺 »

还没有任何评论。

这篇文章上的评论 RSS feed TrackBack URL

留下评论

WordPress 所驱动