技术库 > Symfony

symfony缓存(cache)机制简介

技术库:tec.5lulu.com

from:tec.5lulu.com

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

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

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

  1. dev:
  2. .settings:
  3. cache: on

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

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

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

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

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

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

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

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


$this->getResponse()->addVaryHttpHeader('Cookie');

$this->getResponse()->addVaryHttpHeader('User-Agent');

$this->getResponse()->addVaryHttpHeader('Accept-Language');


<?php

通过增加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
?>

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

symfony缓存(cache)机制简介


本文链接 http://tec.5lulu.com/detail/101p2n2obmnpp8939.html

我来评分 :6.1
0

转载注明:转自5lulu技术库

本站遵循:署名-非商业性使用-禁止演绎 3.0 共享协议

www.5lulu.com