Folge dem Video um zu sehen, wie unsere Website als Web-App auf dem Startbildschirm installiert werden kann.
Anmerkung: Diese Funktion ist in einigen Browsern möglicherweise nicht verfügbar.
<?php
class MemoryCachingStrategy implements ICachingStrategy{
function __construct(){
$_SERVER["MemoryCachingStrategy_Cache"] = array();
}
function cache($item,$timeToCacheInSeconds){
if(!isset($_SERVER["MemoryCachingStrategy_Cache"][$item]) || ((time() - $_SERVER["MemoryCachingStrategy_Cache"][$item]["time"]) > $timeToCacheInSeconds)){
$this->cacheItem($item);
}
}
function cacheItem($item){
ob_start();
include($item);
$contents = ob_get_contents();
ob_end_clean();
$_SERVER["MemoryCachingStrategy_Cache"][$item]["contents"] = $contents;
$_SERVER["MemoryCachingStrategy_Cache"][$item]["time"] = time();
}
function retrieve($item){
if(isset($_SERVER["MemoryCachingStrategy_Cache"][$item])){
return $_SERVER["MemoryCachingStrategy_Cache"][$item]["contents"];
}
}
function cacheAndRetrieve($item,$timeToCacheInSeconds){
//todo
}
}
?>
<?php
require_once("FileSystemCachingStrategy.class.php");
require_once("MemoryCachingStrategy.class.php");
Cache::registerCachingStrategy("Memory",new MemoryCachingStrategy());
Cache::registerCachingStrategy("FileSystem",new FileSystemCachingStrategy());
Cache::register("page.php","FileSystem", 10); //cache that page for 10 seconds (for the sake of testing ;-)
Cache::register("minimal_page.php","Memory", 10); //cache that page for 10 seconds (for the sake of testing ;-)
?>
<?php
class MemoryCachingStrategy implements ICachingStrategy{
private $cacheStore;
function __construct(){
$this->cacheStore = array();
}
function cache($item,$timeToCacheInSeconds){
if(!isset($this->cacheStore[$item]) || ((time() - $this->cacheStore[$item]["time"]) > $timeToCacheInSeconds)){
$this->cacheItem($item);
}
}
function cacheItem($item){
ob_start();
include($item);
$contents = ob_get_contents();
ob_end_clean();
$cachedItem = array();
$cachedItem["contents"] = $contents;
$cachedItem["time"] = time();
$this->cacheStore[$item] = $cachedItem;
}
function retrieve($item){
if(isset($this->cacheStore[$item])){
return $this->cacheStore[$item]["contents"];
}
}
function cacheAndRetrieve($item,$timeToCacheInSeconds){
$this->cache($item,$timeToCacheInSeconds);
return $this->retrieve($item);
}
}
?>
also irgendwie klappt das mit $_Server nicht so wirklich, beim nächsten Aufruf sind die Daten wieder weg und das element wird wieder neu gecached... wie realisiert man denn bei PHP persistente also Dauerhaft vorhandene Variablen?
<?php
require_once("ICachingStrategy.class.php");
include("caching.config.php");
class Cache{
private static $instance = null;
private $resourceToCacheConfigurationMapping= array();
private $cachingStrategyNameToStrategyMapping = array();
private $defaultCachingStrategyName = "FileSystem";
static function registerCachingStrategy($cachingStrategyName,$cachingStrategy){
Cache::getInstance()->cachingStrategyNameToStrategyMapping[$cachingStrategyName]=$cachingStrategy;
}
function registerItem($item,$cachingStrategyName,$timeToCacheInSeconds){
$currentCachingStrategy = $this->cachingStrategyNameToStrategyMapping[$cachingStrategyName];
if(!isset($currentCachingStrategy)){
$currentCachingStrategy=$this->cachingStrategyNameToStrategyMapping[$this->defaultCachingStrategyName];
}
$this->resourceToCacheConfigurationMapping[$item]= array($timeToCacheInSeconds,$currentCachingStrategy);
}
function getCached($item){
if(isset($this->resourceToCacheConfigurationMapping[$item])){
$timeToCacheWithStrategy = $this->resourceToCacheConfigurationMapping[$item];
return $timeToCacheWithStrategy[1]->cacheAndRetrieve($item,$timeToCacheWithStrategy[0]);
}
}
public static function getInstance(){
if(self::$instance == null){
self::$instance = new Cache();
}
return self::$instance;
}
/**
* Shortcut method
*
* @param unknown_type $item
*/
static function get($item){
return Cache::getInstance()->getCached($item);
}
/**
* Shortcut method
*
* @param unknown_type $item
* @param ICachingStrategy $cachingStrategyName
* @param unknown_type $timeToCacheInSeconds
*/
static function register($item,$cachingStrategyName,$timeToCacheInSeconds){
Cache::getInstance()->registerItem($item,$cachingStrategyName,$timeToCacheInSeconds);
}
}
//echo Cache::getInstance()->get("page.php");
?>
<?php
interface ICachingStrategy{
function cache($item,$timeToCacheInSeconds);
function retrieve($item);
function cacheAndRetrieve($item,$timeToCacheInSeconds);
}
?>
<?php
class FileSystemCachingStrategy implements ICachingStrategy{
private $cacheLocation;
private $cachedFileExtension;
function __construct($cacheLocation,$cachedFileExtension){
$this->cacheLocation = $cacheLocation;
$this->cachedFileExtension = $cachedFileExtension;
}
function cacheAndRetrieve($item,$timeToCacheInSeconds){
$staticItem = $this->cacheLocation . $item . $this->cachedFileExtension;
$this->cache($item,$timeToCacheInSeconds);
return $this->retrieve($item);
}
function cache($item,$timeToCacheInSeconds){
$staticItem = $this->cacheLocation . $item . $this->cachedFileExtension;
if(!file_exists($staticItem) || ((time() - filemtime($staticItem)) > $timeToCacheInSeconds)){
$this->cacheItem($item,$staticItem);
}
}
function cacheItem($item,$staticItem){
ob_start();
include($item);
$contents = ob_get_contents();
ob_end_clean();
file_put_contents($staticItem,$contents,LOCK_EX);
}
function retrieve($item){
$staticItem = $this->cacheLocation . $item . $this->cachedFileExtension;
if(file_exists($staticItem)){
return file_get_contents($staticItem);
}
}
}
?>
<?php
require_once("FileSystemCachingStrategy.class.php");
$OUTPUT_DIRECTORY = "static/";
$PAGE_EXTENSION = ".static";
Cache::registerCachingStrategy("FileSystem",new FileSystemCachingStrategy($OUTPUT_DIRECTORY,$PAGE_EXTENSION));
Cache::registerCachingStrategy("Memory",new FileSystemCachingStrategy("/dev/shm/tutorials.de/MemoryCachingStrategy/".$OUTPUT_DIRECTORY,$PAGE_EXTENSION));
Cache::register("page.php","FileSystem", 10); //cache that page for 10 seconds (for the sake of testing ;-)
//Cache::register("minimal_page.php","FileSystem", 10); //cache that page for 10 seconds (for the sake of testing ;-)
?>
<?php
echo "A ";
include("page_cached.php");
echo " B";
/*
echo "<br/>C ";
include("minimal_page_cached.php");
echo " D";
*/
?>
<?php
echo "<b>Current time: ". time() ." </b>\n";
?>
<?php
require_once ("./caching/Cache.class.php");
echo Cache::get(str_replace("_cached","",basename(__file__)));
?>
<b>Current time: 1206449879 </b>
Die vom Cache zwischengespeicherten Werte haben ein konfigurierbares Verfalldatum Beispielsweise 5 min. Der erste Zugriff nach dieser Zeit stößt dann die Neugenerierung an. Nur dann neu zugenerieren wenn sich der dahinter liegende Content geändert hat wäre eine Optimierung.Soll der Cache immer ueber einen bestimmten Zeitraum genutzt werden oder nur solang sich nichts aendert?
Ich hatte mal mit dem Caching von gefuellten Templates gespielt, jedoch ist das Problem eben dass man bei festgelegten Zeitraeumen eventuell nicht immer die aktuellsten Informationen anzeigt.