public/Cerebro/inc/WURFL/Storage/File.php line 64

Open in your IDE?
  1. <?php
  2. /**
  3.  * Copyright (c) 2012 ScientiaMobile, Inc.
  4.  *
  5.  * This program is free software: you can redistribute it and/or modify
  6.  * it under the terms of the GNU Affero General Public License as
  7.  * published by the Free Software Foundation, either version 3 of the
  8.  * License, or (at your option) any later version.
  9.  *
  10.  * Refer to the COPYING.txt file distributed with this package.
  11.  *
  12.  * @category   WURFL
  13.  * @package    WURFL_Storage
  14.  * @copyright  ScientiaMobile, Inc.
  15.  * @license    GNU Affero General Public License
  16.  * @author     Fantayeneh Asres Gizaw
  17.  * @version    $id$
  18.  */
  19. /**
  20.  * WURFL Storage
  21.  * @package    WURFL_Storage
  22.  */
  23. class WURFL_Storage_File extends WURFL_Storage_Base {
  24.     private $defaultParams = array(
  25.         "dir" => "/tmp",
  26.         "expiration" => 0,
  27.     );
  28.     private $expire;
  29.     private $root;
  30.     
  31.     const DIR "dir";
  32.     protected $supports_secondary_caching true;
  33.     
  34.     public function __construct($params) {
  35.         $currentParams is_array($params)? array_merge($this->defaultParams$params): $this->defaultParams;
  36.         $this->initialize($currentParams);
  37.     }
  38.     public function initialize($params) {
  39.         $this->root $params[self::DIR];
  40.         $this->createCacheDirIfNotExist();
  41.         $this->expire $params["expiration"];
  42.     }
  43.     private function createCacheDirIfNotExist() {
  44.         if (!is_dir($this->root)) {
  45.             @mkdir ($this->root0777true);
  46.             if(!is_dir($this->root)){
  47.                 throw new WURFL_Storage_Exception("The file cache directory does not exist and could not be created. Please make sure the cache directory is writeable: ".$this->root);
  48.             }
  49.         }
  50.         if(!is_writeable($this->root)){
  51.             throw new WURFL_Storage_Exception("The file cache directory is not writeable: ".$this->root);
  52.         }
  53.     }
  54.     public function load($key) {
  55.         if (($data $this->cacheLoad($key)) !== null) {
  56.             return $data->value();
  57.         } else {
  58.             $path $this->keyPath($key);
  59.             $value WURFL_FileUtils::read($path);
  60.             if ($value === null) {
  61.                 return null;
  62.             }
  63.             $this->cacheSave($key$value);
  64.             return $this->unwrap($value$path);
  65.         }
  66.     }
  67.     private function unwrap($value$path) {
  68.         if ($value->isExpired()) {
  69.             unlink($path);
  70.             return null;
  71.         }
  72.         return $value->value();
  73.     }
  74.     public function save($key$value$expiration=null) {
  75.         $value = new StorageObject($value, (($expiration === null)? $this->expire$expiration));
  76.         $path $this->keyPath($key);
  77.         WURFL_FileUtils::write($path$value);
  78.     }
  79.     public function clear() {
  80.         $this->cacheClear();
  81.         WURFL_FileUtils::rmdirContents($this->root);
  82.     }
  83.     private function keyPath($key) {
  84.         return WURFL_FileUtils::join(array($this->root$this->spread(md5($key))));
  85.     }
  86.     function spread($md5$n 2) {
  87.         $path "";
  88.         for ($i 0$i $n$i++) {
  89.             $path .= $md5 [$i] . DIRECTORY_SEPARATOR;
  90.         }
  91.         $path .= substr($md5$n);
  92.         return $path;
  93.     }
  94. }
  95. /**
  96.  * Object for storing data
  97.  * @package WURFL_Storage
  98.  */
  99. class StorageObject {
  100.     private $value;
  101.     private $expiringOn;
  102.     public function __construct($value$expire) {
  103.         $this->value $value;
  104.         $this->expiringOn = ($expire === 0) ? $expire time() + $expire;
  105.     }
  106.     public function value() {
  107.         return $this->value;
  108.     }
  109.     public function isExpired() {
  110.         if ($this->expiringOn === 0) {
  111.             return false;
  112.         }
  113.         return $this->expiringOn time();
  114.     }
  115.     public function expiringOn() {
  116.         return $this->expiringOn;
  117.     }
  118. }