前言:
如果你使用Symfony2框架做项目,那么可能你需要缓存一些数据;说到缓存,方法却是很多,从数据库到文件到内存,再分N种缓存技术,比如php自带的file_put_contents(文件缓存),以及最常见的memcached、APC、redis(内存缓存)等等。
选择哪一种缓存:
确实任何一种缓存技术都可能将你的程序提高许多速度,然而选择哪一种缓存得根据你项目的实际情况来看。对于点击量大的建议使用memcached、APC、redis等工具来缓存,因为他们的结构分明,读取更快;对于变化不大,经常从一台服务器取另一台服务器的内容时(比如读取API数据),选择简单的文件缓存也能比拟工具的速度。
Symfony2 file cache:
无需任何配置,只需要在你需要操作的controller文件上方引用Filesystem和IOException即可
use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\Filesystem\Exception\IOException;
DefultControll.php
<?php
namespace Ce\WebBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Filesystem\Exception\IOException;
/**
* @接口缓存文件方法(在实际项目中可以吧它写到model里)
* @$pertime = 0 为无限生命
*/
private function cacheFile($filename, $date, $pertime = 0 )
{
if(empty($filename) || empty($date)){
return false;
}
//在缓存目录中创建自己的文件
$fs = new Filesystem();
try {
$fs->mkdir(dirname($filename));
} catch (IOException $e) {
return false;
}
//整合数据
$time = time();
$cache = array();
$cache[‘contents‘] = $date;
$cache[‘pertime‘] = $pertime === 0 ? 0 : $time + $pertime;
$cache[‘mtime‘] = $time;
$res = serialize($cache);
//写下你的文件
$result = false;
$f = @fopen($filename, ‘w‘);
if ($f) {
@flock($f, LOCK_EX);
fseek($f, 0);
ftruncate($f, 0);
$tmp = @fwrite($f, $res);
if (!($tmp === false)) {
$result = true;
}
@fclose($f);
}
@chmod($filename,0777);
return $result;
}
/**
* @清除缓存文件
*/
private function clearFile($filename)
{
if(!file_exists($filename)){
return false;
}else{
//删除缓存文件
return unlink($filename);
}
}
/**
* @调用缓存的方法
* @Route("/file")
* @Template()
*/
public function fileAction()
{
$name = ‘multiDepot‘;
//这里传入需要缓存的数据
$date = [‘id‘=>1,‘name‘=>‘小军‘];
//设置的缓存时间
$pertime = 10;
$newTime = time();
//设置缓存路径
$filename = $this->container->getParameter(‘kernel.cache_dir‘) . ‘‘.$name.‘.txt‘;
//如果存在缓存文件,取缓存文件内容
if(file_exists($filename)){
//阅读你的文件的内容
$res = unserialize(file_get_contents($filename));
//如果文件已经过期,重新缓存文件
if($res[‘mtime‘] - $newTime < $pertime){
$this->clearFile($filename);
$this->cacheFile($filename, $date, $pertime);
}
//这里需要判断当前数据是否有更新,有更新则从接口取数据,重新种缓存
//if(true){
// clearFile($filename);
// $this->cacheFile( $filename, $date, $pertime );
//}
}else{
//不存在则缓存文件
$this->cacheFile($filename, $date);
}OK,非常简单就实现了Symfony2的文件缓存,缓存的文件在 D:\wamp\www\abc\branches\dev\app\ cache\dev 文件夹下。
这里需要注意的是interfere文件夹需要自己手动创建,在服务器上的话还需要设置权限为可写、可读。
本文出自 “Shows technology” 博客,请务必保留此出处http://wangzhijun.blog.51cto.com/9660708/1676663
原文地址:http://wangzhijun.blog.51cto.com/9660708/1676663