前言:
如果你使用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文件夹需要自己手动创建,在服务器上的话还需要设置权限为可写、可读。
转载于:https://blog.51cto.com/wangzhijun/1676663