关于缓存
symfony可以处理三种不同类型的html缓存:
- 动作的缓存(包含或不包含布局)
- 局部模板,组件或组件槽的缓存
- 模板片段的缓存
全局缓存设置
在项目的配置目录下:
例:
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
?>
最后清缓存.
这样,就在你为应用程序的开启缓存的模式下启用了。