view FileCacheSet.inc @ 103:23a59da90fc7

Make static function static.
author Tom Fredrik "BFG" Klaussen <bfg@blenning.no>
date Mon, 07 Mar 2016 17:06:42 +0100
parents d98e315308cd
children adf7b11921f4
line wrap: on
line source

<?php
$baseDir = dirname(__FILE__);

include_once 'Logger.inc';
$cache = ScriptIncludeCache::instance(__FILE__);
$cache->cache_time("${baseDir}/Logger.inc");

class Cache {
  private $max_age=0;
  function setMaxAge($seconds)
  {
    $this->max_age=$seconds;
  }

  function cacheControl() {
    return array("expires" => toGMTime(time()+$this->max_age), "cache-control" => "public, max-age=$this->max_age");
  }

};

/**
 * Caches a set of file with timestamps
 */
class FileCacheSet extends Cache {
  private $newest = 0;
  private $files = array();
  private $parentCaches = array();

  /**
   * Constructs a FileCacheSet object
   *
   * @param $parent optional linked parent cache to sync with
   */
  protected function __construct($parent = null) {
    if ($parent) {
      $this->addParent($parent);
    }
  }

  /**
   * Links up a parent cache
   *
   * @param $parent cache we should sync with
   */
  protected function addParent($parent)
  {
    array_push($this->parentCaches, $parent);
  }

  /**
   * List a set of files which contributes to this pages cacheset.
   *
   * @param $humanReadable If the timestamp should be human readable.
   *
   * @return an associative array of file, and timestamp
   */
  function cacheSet($humanReadable = False)
  {
    $retVal = array();
    foreach ($this->parentCaches as $parent) {
      $retVal = array_merge($retVal, $parent->cacheSet($humanReadable));
    }
    foreach($this->files as $file) {
      $mtime = filemtime($file);
      if ($humanReadable)
	$mtime = gmdate('D, d M Y H:i:s', $mtime) . ' GMT';

      $retVal[$file] = $mtime;
    }
    return $retVal;
  }

  /**
   * Include a file in the cacheset
   *
   * @param $path the path of the file
   */
  function cache_time($path)
  {
    if (!file_exists($path)) {
      Logger::warn("${path} does not exist");
      errorPage("Resource is not available", 404);
    }

    array_push($this->files, $path);
    $mtime = filemtime($path);
    if ($mtime > $this->newest) {
      $this->newest = $mtime;
    }
  }

  /**
   * Find the newest member of the combined cacheset
   *
   * @return timestamp of newest member
   */
  function getNewest()
  {
    $newest = 0;
    foreach ($this->parentCaches as $parent) {
      $newest = max($newest, $parent->getNewest());
    }
    $newest = max($newest, $this->newest);
    return $newest;
  }
}

/**
 * Singleton class, keeps track of all scriptfile includes
 *
 * This class is typically used as a parent class of another cache
 */
class ScriptIncludeCache extends FileCacheSet
{
  private static $myInstance = 0;

  protected function __construct($filename = False)
  {
    parent::__construct();
    if ($filename)
      $this->cache_time($filename);
    $this->cache_time(__FILE__);
  }

  /**
   * Generates a singleton instance of this CacheTimeCheck
   *
   * @param $filename an optional file to include in the cacheset
   *
   * @return a CacheTimeCheck object
   */
  public static function instance($filename = False)
  {
    if (! self::$myInstance)
      self::$myInstance = new self($filename);
    elseif ($filename)
      self::$myInstance->cache_time($filename);
    return self::$myInstance;
  }

  /**
   * Convenience function to include a file, and add it to the cacheset.
   *
   * @param $path path of the file
   * @param $basedir a directory to prepend to the path
   */
  function includeOnce($path, $basedir = false)
  {
    if ($basedir)
      $path = $basedir . "/" . $path;
    $this->cache_time($path);
    include_once($path);
  }
}
?>