Symfony2自带文件缓存(cache)功能用法

    前言:    

    如果你使用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文件夹需要自己手动创建,在服务器上的话还需要设置权限为可写、可读。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章