00001 <?php
00027 require_once 'Zend/Cache/Core.php';
00028
00029
00036 class Zend_Cache_Frontend_File extends Zend_Cache_Core
00037 {
00038
00042 const MODE_AND = 'AND';
00043 const MODE_OR = 'OR';
00044
00066 protected $_specificOptions = array(
00067 'master_file' => null,
00068 'master_files' => null,
00069 'master_files_mode' => 'OR',
00070 'ignore_missing_master_files' => false
00071 );
00072
00080 private $_masterFile_mtimes = null;
00081
00089 public function __construct(array $options = array())
00090 {
00091 while (list($name, $value) = each($options)) {
00092 $this->setOption($name, $value);
00093 }
00094 if (!isset($this->_specificOptions['master_files'])) {
00095 Zend_Cache::throwException('master_files option must be set');
00096 }
00097 }
00098
00104 public function setMasterFiles($masterFiles)
00105 {
00106 clearstatcache();
00107 $this->_specificOptions['master_file'] = $masterFiles[0];
00108 $this->_specificOptions['master_files'] = $masterFiles;
00109 $this->_masterFile_mtimes = array();
00110 $i = 0;
00111 foreach ($masterFiles as $masterFile) {
00112 $this->_masterFile_mtimes[$i] = @filemtime($masterFile);
00113 if ((!($this->_specificOptions['ignore_missing_master_files'])) && (!($this->_masterFile_mtimes[$i]))) {
00114 Zend_Cache::throwException('Unable to read master_file : '.$masterFile);
00115 }
00116 $i++;
00117 }
00118 }
00119
00128 public function setMasterFile($masterFile)
00129 {
00130 $this->setMasterFiles(array(0 => $masterFile));
00131 }
00132
00143 public function setOption($name, $value)
00144 {
00145 if ($name == 'master_file') {
00146 $this->setMasterFile($value);
00147 } else if ($name == 'master_files') {
00148 $this->setMasterFiles($value);
00149 } else {
00150 parent::setOption($name, $value);
00151 }
00152 }
00153
00162 public function load($id, $doNotTestCacheValidity = false, $doNotUnserialize = false)
00163 {
00164 if (!$doNotTestCacheValidity) {
00165 if ($this->test($id)) {
00166 return parent::load($id, true, $doNotUnserialize);
00167 }
00168 return false;
00169 }
00170 return parent::load($id, true, $doNotUnserialize);
00171 }
00172
00179 public function test($id)
00180 {
00181 $lastModified = parent::test($id);
00182 if ($lastModified) {
00183 if ($this->_specificOptions['master_files_mode'] == self::MODE_AND) {
00184
00185 foreach($this->_masterFile_mtimes as $masterFileMTime) {
00186 if ($masterFileMTime) {
00187 if ($lastModified > $masterFileMTime) {
00188 return $lastModified;
00189 }
00190 }
00191 }
00192 } else {
00193
00194 $res = true;
00195 foreach($this->_masterFile_mtimes as $masterFileMTime) {
00196 if ($masterFileMTime) {
00197 if ($lastModified <= $masterFileMTime) {
00198 return false;
00199 }
00200 }
00201 }
00202 return $lastModified;
00203 }
00204 }
00205 return false;
00206 }
00207
00208 }
00209