Du bist nicht angemeldet. Der Zugriff auf einige Boards wurde daher deaktiviert.

#1 20. April 2014 13:34

Tranquillius
probiert CMS/ms aus
Ort: Leipzig
Registriert: 10. September 2013
Beiträge: 52

Wie Cache in Plugin integrieren?

Also mittlerweile bin ich soweit, dass ich einfache Plugins selber schreiben kann. Nun ich habe 3 Plugins zu EVE-API-Abfragen geschrieben, wovon eben 2 mit einer Art Cache ausgestattet werden sollen, der bereits geladene Daten ca. 1h vorhält.

Mal ein simples Beispiel (was später nur 1min gecached werden soll):

[== PHP ==]
<?php

function smarty_function_serverstatus($params, &$smarty) {

	$eveserver = simplexml_load_file('https://api.eveonline.com/server/ServerStatus.xml.aspx');
	$evetime = strtotime($eveserver->currentTime);
	
	$status = $eveserver->result->serverOpen;
	$playercount = $eveserver->result->onlinePlayers;
		
	$smarty->assign('evetime', $evetime);
	$smarty->assign('status', $status);
	$smarty->assign('playercount', $playercount);
}
function smarty_cms_help_function_serverstatus() {
		echo 'Plugin zum Abfragen des Serverstatus von EVE Online <br />';
		echo 'Mit den Tag {serverstatus} einbinden!';
}
function smarty_cms_about_function_serverstatus() {
		echo 'EVE Online Serverstatus';
}
?>

Für Smarty gibt es ja einen Cache für Templates Smarty-Cache. Gibt es eine Funktion die CMSMS mitbringt? Wie lässt es sich am besten integrieren? Am liebsten ohne Template!

Offline

#2 22. April 2014 09:16

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.435

Re: Wie Cache in Plugin integrieren?

Nö. Gibt da keine fertige Lösung.
Jedenfalls nicht, dass ich wüsste.
Das musst Du Dir selber basteln.
Ist aber nicht weiter schwer.

Du musst vor der Abfrage des EVE Online Servers prüfen, ob die Daten, die Du brauchst, schon auf Deinem Server in einer Datei liegen. Und, ob diese Datei älter ist als ein bestimmter Zeitraum. Wenn sie existiert und noch nicht zu alt ist, dann lies sie einfach aus und verwende ihren Inhalt.

Ansonsten mache die Abfrage an den EVE Online Server, lese die Daten aus dem XML Ergebnis aus und speichere sie in der besagten Datei.

Bsp.:

<?php
function smarty_function_serverstatus($params, &$smarty) {
    
    $config    = cmsms()->GetConfig();
    $cache_dir = $config['root_path'] . '/tmp/cache/EVE-Online';
    if(!is_dir($cache_dir))
        mkdir($cache_dir, 0777, true);
    
    # cache file
    $cache_file     = $cache_dir . '/serverstatus.xml';
    
    # cache lifetime in seconds (default = 1 minute)
    $cache_lifetime = isset($params['cache_lifetime']) ? (int)$params['cache_lifetime'] : 60;
    
    # check cache:
    if(!is_file($cache_file) || (time() - filectime($cache_file)) >= $cache_lifetime)
    {
        # load from server:
        $data      = file_get_contents('https://api.eveonline.com/server/ServerStatus.xml.aspx');
        $eveserver = simplexml_load_string($data);
        
        # write cache:
        file_put_contents($cache_file, $data);
    }
    else # load from cache:
        $eveserver = simplexml_load_file($cache_file); 
    
    $smarty->assign('evetime',     strtotime($eveserver->currentTime));
    $smarty->assign('status',      $eveserver->result->serverOpen);
    $smarty->assign('playercount', $eveserver->result->onlinePlayers);
}
function smarty_cms_help_function_serverstatus() {
        echo 'Plugin zum Abfragen des Serverstatus von EVE Online <br />';
        echo 'Mit den Tag {serverstatus} einbinden!';
}
function smarty_cms_about_function_serverstatus() {
        echo 'EVE Online Serverstatus';
}
?>

Aufruf (für eine Stunde zwischenspeichern):

{serverstatus cache_lifetime="3600"}

Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12 unter PHP 7:
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)
CMSms 1.12 unter PHP 8:
cmsms-1.12.4.zip (inoffiziell - komplett inkl. Installer)

Offline

#3 22. April 2014 10:47

Andynium
Moderator
Ort: Dohna / SN / Deutschland
Registriert: 13. September 2010
Beiträge: 7.017
Webseite

Re: Wie Cache in Plugin integrieren?

Tranquillius schrieb:

Für Smarty gibt es ja einen Cache für Templates Smarty-Cache. Gibt es eine Funktion die CMSMS mitbringt?

Indirekt schon, nur leider hast du in diesem konkreten Fall falsch verlinkt tongue , da der Cache ein Thema ist, wo sich von Smarty2 auf Smarty3 einiges getan hat. Die richtige Quelle wäre daher

www.smarty.net/docs/en/caching.tpl

gewesen (gibts leider noch nicht in deutsch). Etwas mehr ins Detail geht es hier

http://www.smarty.net/docs/en/caching.cacheable.tpl

Und wenn du in deiner Administration unter Webseiten-Administration > Globale Einstellungen > Smarty-Einstellungen schaust, findest du den Eintrag Aufrufe von Benutzerdefinierten Tags zwischenspeichern

So ließe sich u.U. auch Smarty als Cache-Lösung einsetzen. Voreingestellt ist eine Stunde. Wenn du abweichende Zeiten definieren willst, musst du mit ner Cache-ID arbeiten

http://www.pressinganswer.com/2509236/h … n-to-cache

Offline

#4 22. April 2014 21:35

Tranquillius
probiert CMS/ms aus
Ort: Leipzig
Registriert: 10. September 2013
Beiträge: 52

Re: Wie Cache in Plugin integrieren?

Danke für eure Antworten. Ich habe es nun mit NaNs Code und einigen Syntax-Korrekturen hinbekommen.

Was mich jetzt nur wundert, ich kann im Cache-Ordner nichts finden, aber es wird definitiv gecached!

Hier mein finaler Code:

[== PHP ==]
<?php

function smarty_function_serverstatus($params, &$smarty) {

	$cache_dir = '/tmp/cache/eveapi';
	
	if(!is_dir($cache_dir)) {
		mkdir($cache_dir, 0777, true);
	}
	
	$cache_file = '/tmp/cache/eveapi/serverstatus.xml';
	
	if(isset($params['cache_lifetime'])) 
	{
		$cache_lifetime = $params['cache_lifetime'];
	}

	if(!is_file($cache_file) || (time() - filectime($cache_file)) >= $cache_lifetime)
    {
        $data      = file_get_contents('https://api.eveonline.com/server/ServerStatus.xml.aspx');
        $eveserver = simplexml_load_string($data); 
		
        file_put_contents($cache_file, $data);
    }
    else 
	{
        $eveserver = simplexml_load_file($cache_file);
	}
		
	$smarty->assign('evetime', strtotime($eveserver->currentTime));
	$smarty->assign('status', $eveserver->result->serverOpen);
	$smarty->assign('playercount', $eveserver->result->onlinePlayers);
}
function smarty_cms_help_function_serverstatus() {
		echo 'Plugin zum Abfragen des Serverstatus von EVE Online <br />';
		echo 'Mit den Tag {serverstatus} einbinden!';
}
function smarty_cms_about_function_serverstatus() {
		echo 'EVE Online Serverstatus';
}
?>

Und NaN, wenn du mal wieder in der Nachbarstadt bist, lade ich dich als Dank auf ein Bier ein. Du hast mir ja nicht nur diesmal wieder sehr geholfen!

Offline

#5 23. April 2014 22:01

Andynium
Moderator
Ort: Dohna / SN / Deutschland
Registriert: 13. September 2010
Beiträge: 7.017
Webseite

Re: Wie Cache in Plugin integrieren?

Tranquillius schrieb:

Was mich jetzt nur wundert, ich kann im Cache-Ordner nichts finden, aber es wird definitiv gecached!

Der Cache wird vom Server beschrieben. Möglicherweise hast du von daher einfach nicht die Berechtigung, die Dateien zu sehen (trotz 0777). Wenn der Server da 'ne Voreinstellung hat, siehst du die einfach nicht ...

Offline

#6 23. April 2014 11:46

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.435

Re: Wie Cache in Plugin integrieren?

Sicher, dass Du im richtigen Verzeichnis suchst?
Wenn

einigen Syntax-Korrekturen

dazu führen

ich kann im Cache-Ordner nichts finden, aber es wird definitiv gecached!

dann schau Dir Deine "Korrekturen" doch einfach nochmal etwas genauer an wink

$cache_dir = '/tmp/cache/eveapi';

Dieses Verzeichnis befindet sich außerhalb Deiner CMSms Installation.
(unter Windows bedeutet das z.B. "C:\tmp\cache\eveapi" - hattest Du das tatsächlich so im Sinn?)

Das von mir vorgeschlagene Verzeichnis liegt bei Deiner CMSms Installation unter
" [Pfad zum CMS] /tmp/cache/... ".
Ich hatte das so gemacht, damit man die Datei auch über das Backend unter "Webseiten Administration -> Systemwartung" beim Löschen des Zwischenspeichers gleich mit löschen kann.

Und NaN, wenn du mal wieder in der Nachbarstadt bist, lade ich dich als Dank auf ein Bier ein.

Gern geschehen. Darf's auch ein Kaffee sein? wink


Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12 unter PHP 7:
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)
CMSms 1.12 unter PHP 8:
cmsms-1.12.4.zip (inoffiziell - komplett inkl. Installer)

Offline

#7 23. April 2014 14:25

Tranquillius
probiert CMS/ms aus
Ort: Leipzig
Registriert: 10. September 2013
Beiträge: 52

Re: Wie Cache in Plugin integrieren?

Ich dachte relative Pfadangaben funktionieren genauso?!

[== PHP ==]
<?php

function smarty_function_serverstatus($params, &$smarty) {

	$config    = cmsms()->GetConfig();
	$cache_dir = $config['root_url'].'/tmp/cache/eveapi';
	
	if(!is_dir($cache_dir)) {
		mkdir($cache_dir, 0777, true);
	}
	
	$cache_file = $config['root_url'].'/tmp/cache/eveapi/serverstatus.xml';
	
	if(isset($params['cache_lifetime'])) 
	{
		$cache_lifetime = $params['cache_lifetime'];
	}

	if(!is_file($cache_file) || (time() - filectime($cache_file)) >= $cache_lifetime)
    {
        $data      = file_get_contents('https://api.eveonline.com/server/ServerStatus.xml.aspx');
        $eveserver = simplexml_load_string($data); 
		
        file_put_contents($cache_file, $data);
    }
    else 
	{
        $eveserver = simplexml_load_file($cache_file);
	}
	
	$smarty->assign('evetime', strtotime($eveserver->currentTime));
	$smarty->assign('status', $eveserver->result->serverOpen);
	$smarty->assign('playercount', $eveserver->result->onlinePlayers);
}
function smarty_cms_help_function_serverstatus() {
		echo 'Plugin zum Abfragen des Serverstatus von EVE Online <br />';
		echo 'Mit den Tag {serverstatus} einbinden! <br />';
		echo 'Tag {evetime} = Zeitstempel Serverzeit <br />';
		echo 'Tag {status} = Status Server (True - Online; False - Offline) <br />';
		echo 'Tag {playercount} = Anzahl der Spieler <br />';
}
function smarty_cms_about_function_serverstatus() {
		echo 'EVE Online Serverstatus';
}
?>

Kaffee wäre auch möglich!  smile

Offline

#8 23. April 2014 14:26

nockenfell
Moderator
Ort: Lenzburg, Schweiz
Registriert: 09. November 2010
Beiträge: 2.927
Webseite

Re: Wie Cache in Plugin integrieren?

Es müsste $config['root_path'] heissen. Bei "root_url" kommt ein http:... raus.


[dieser Beitrag wurde mit 100% recycled bits geschrieben]
Mein Blog  /   Diverse Links rund um CMS Made Simple
Module: btAdminer, ToolBox

Offline

#9 23. April 2014 14:56

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.435

Re: Wie Cache in Plugin integrieren?

Ich dachte relative Pfadangaben funktionieren genauso?!

Jein.
Wenn ein Schrägstrich am Anfang steht, geht PHP (genauso wie der Browser bei URLs) vom Root aus. (ergo kein relativer Pfad mehr)

Also entweder so:

$config    = cmsms()->GetConfig();
$cache_dir = $config['root_path'] . '/tmp/cache/eveapi';
if(!is_dir($cache_dir))
        mkdir($cache_dir, 0777, true);

$cache_file = $cache_dir . '/serverstatus.xml';

Oder so:

$cache_dir = 'tmp/cache/eveapi';
if(!is_dir($cache_dir))
        mkdir($cache_dir, 0777, true);

$cache_file = $cache_dir . '/serverstatus.xml';

Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12 unter PHP 7:
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)
CMSms 1.12 unter PHP 8:
cmsms-1.12.4.zip (inoffiziell - komplett inkl. Installer)

Offline

#10 23. April 2014 17:58

Tranquillius
probiert CMS/ms aus
Ort: Leipzig
Registriert: 10. September 2013
Beiträge: 52

Re: Wie Cache in Plugin integrieren?

Ich habs korrigiert. Mein Fehler war auch root_url =/= root_path.

Noch eine Frage: Wenn ich mehrere Funktionen jetzt mit Cache aufrufe, muss ich dem Parameter einen eindeutigen Namen geben, oder wird immer nur der Parameter zur jeweiligen Funktion zugeordnet (ich meine hier cache_lifetime). Weil ich müsste die 3 Funktionen gleichzeitig aufrufen.

Offline

#11 23. April 2014 18:54

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.435

Re: Wie Cache in Plugin integrieren?

oder wird immer nur der Parameter zur jeweiligen Funktion zugeordnet

Genau.
Jeder Aufruf hat seine eigenen Parameter.


Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12 unter PHP 7:
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)
CMSms 1.12 unter PHP 8:
cmsms-1.12.4.zip (inoffiziell - komplett inkl. Installer)

Offline

#12 24. April 2014 13:54

Tranquillius
probiert CMS/ms aus
Ort: Leipzig
Registriert: 10. September 2013
Beiträge: 52

Re: Wie Cache in Plugin integrieren?

Ich hab den Parameter jetzt entfernt und nutze als "Cache-Variable" den mit der XML-Datei übermittelten Wert "cachedUntil". Kritik/Verbesserungsvorschläge?

[== PHP ==]
<?php

function smarty_function_serverstatus($params, &$smarty) {
	
	date_default_timezone_set('UTC');
	
	$config    = cmsms()->GetConfig();
	$cache_dir = $config['root_path'].'/tmp/cache/eveapi';
	
	if(!is_dir($cache_dir)) {
		mkdir($cache_dir, 0777, true);
	}
	
	$cache_file = $cache_dir.'/serverstatus.xml';
	
	if(file_exists($cache_file))
	{
		$xmltemp = simplexml_load_file($cache_file);
		$cached_until = strtotime($xmltemp->cachedUntil);
	}
	else
	{
		$cached_until = 0;
	}

	if(!is_file($cache_file) || (time() >= $cached_until))
    {
        $data      = file_get_contents('https://api.eveonline.com/server/ServerStatus.xml.aspx');
        $eveserver = simplexml_load_string($data); 
		
        file_put_contents($cache_file, $data);
    }
    else 
	{
        $eveserver = simplexml_load_file($cache_file);
	}
		
	$smarty->assign('evetime', strtotime($eveserver->currentTime));
	$smarty->assign('status', $eveserver->result->serverOpen);
	$smarty->assign('playercount', $eveserver->result->onlinePlayers);
}

function smarty_cms_help_function_serverstatus() {
		echo 'Plugin zum Abfragen des Serverstatus von EVE Online <br />';
		echo 'Mit den Tag {serverstatus} einbinden!';
}

function smarty_cms_about_function_serverstatus() {
		echo 'EVE Online Serverstatus';
}
?>

Beitrag geändert von Tranquillius (24. April 2014 13:57)

Offline

#13 24. April 2014 14:38

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.435

Re: Wie Cache in Plugin integrieren?

Damit nimmst Du Dir aber den Performance-Vorteil, weil Du den Cache jedesmal erst verarbeiten musst, und das nur um festzustellen, ob er überhaupt noch aktuell ist. Fällt vielleicht in diesem Fall nicht so sehr ins Gewicht, weil es nicht so viele Daten sind, aber ich will es zumindest mal angemerkt haben.

Ich würd's trotzdem etwas anders machen. Z.B. den Cache nur einmal auslesen. Denn wenn Du den Cache eh schon einmal zum Prüfen seiner Gültigkeit ausgelesen hast, dann kannst Du Dir doch das zweite mal sparen, wenn er noch aktuell ist:

<?php

function smarty_function_serverstatus($params, &$smarty) 
{
    date_default_timezone_set('UTC');
    
    $config    = cmsms()->GetConfig();
    $cache_dir = $config['root_path'] . '/tmp/cache/eveapi';
    
    if(!is_dir($cache_dir))
        mkdir($cache_dir, 0777, true);
    
    $cache_file   = $cache_dir . '/serverstatus.xml';
    $cached_until = 0;
    
    # wenn es die datei gibt, dann auslesen, $eveserver laden und $cached_until setzen
    if(is_file($cache_file))
    {
        $eveserver    = simplexml_load_file($cache_file);
        $cached_until = strtotime($eveserver->cachedUntil);
    }
    
    # jetzt braucht man nur noch $cached_until mit dem aktuellen timestamp zu vergleichen
    # denn ob die Datei existiert, haben wir ja oben schon geprüft 
    # und dementsprechend den Wert für $cached_until bzw. $eveserver gesetzt
    if(time() >= $cached_until)
    {
        $data      = file_get_contents('https://api.eveonline.com/server/ServerStatus.xml.aspx');
        $eveserver = simplexml_load_string($data);
        file_put_contents($cache_file, $data);
    }
    
    $smarty->assign('evetime',     strtotime($eveserver->currentTime));
    $smarty->assign('status',      $eveserver->result->serverOpen);
    $smarty->assign('playercount', $eveserver->result->onlinePlayers);
}

function smarty_cms_help_function_serverstatus() 
{
    echo 'Plugin zum Abfragen des Serverstatus von EVE Online <br />';
    echo 'Mit den Tag {serverstatus} einbinden!';
}

function smarty_cms_about_function_serverstatus() 
{
    echo 'EVE Online Serverstatus';
}
?>

Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12 unter PHP 7:
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)
CMSms 1.12 unter PHP 8:
cmsms-1.12.4.zip (inoffiziell - komplett inkl. Installer)

Offline

#14 25. April 2014 07:27

Tranquillius
probiert CMS/ms aus
Ort: Leipzig
Registriert: 10. September 2013
Beiträge: 52

Re: Wie Cache in Plugin integrieren?

Super, ans optimieren denke ich oft noch gar nicht, da ich froh bin, wenn alles überhaupt funktioniert. Aber jeder fängt mal mit den Basics an. Dein Code funktioniert tadellos. Danke mal wieder. Ich habe es mal versucht auf die deutlich größere Api-Abfrage einzubauen.

[== PHP ==]
<?php

function smarty_function_poswatch($params, &$smarty) { 
	
// Verifizierung wurde durch Dummydaten ersetzt!

        date_default_timezone_set('UTC');

	$keyID = '1234567';
	$vCode = '7oqrC6nJPmxLdfgh79456sdkhj98TRyLVrhjnhQWoXBVQik3XMZOH5Y';

	$config    = cmsms()->GetConfig();
	$cache_dir = $config['root_path'].'/tmp/cache/eveapi';
	
	if(!is_dir($cache_dir)) {
		mkdir($cache_dir, 0777, true);
	}	
	$cache_file = $cache_dir.'/starbaselist.xml';
	$cached_until = 0;

    if(is_file($cache_file))
    {
        $poslistxml = simplexml_load_file($cache_file);
        $cached_until = strtotime($poslistxml->cachedUntil);
		
		$cacheddata = 'Yes';
    }
    if(time() >= $cached_until)
    {
        $data = file_get_contents('https://api.eveonline.com/corp/StarbaseList.xml.aspx?keyID='.$keyID.'&vCode='.$vCode);
        $poslistxml = simplexml_load_string($data); 
        file_put_contents($cache_file, $data);
		
		$cacheddata = 'No';
    }
	
	$cachetimestamp = strtotime($poslistxml->currentTime);
	$poslist = $poslistxml->result->rowset;
	
	$posnr = 1;
	
	foreach ($poslist->children() as $row) {
		
		$positem = array(					
				'itemid' => $row['itemID'],
				'statetimestamp' => $row['stateTimestamp'],
				'onlinetimestamp' => $row['onlineTimestamp']
				);
//Auflösen des Status				
				switch($row['state'])
				{
					case '0':
						$positem['state'] = 'Unanchored';
						break;
					case '1':
						$positem['state'] = 'Offline';
						break;
					case '2':
						$positem['state'] = 'Onlining';
						break;
					case '3':
						$positem['state'] = 'Reinforced';
						break;
					case '4':
						$positem['state'] = 'Online';
						break;
					default:
						$positem['state'] = 'Unknown state';
				}
//Auflösen der typeIDs - Towertyp				
				switch($row['typeID'])
				{
					case '16213':
						$positem['type'] = 'Caldari Control Tower';
						break;
					case '20061':
						$positem['type'] = 'Caldari Control Tower Medium';
						break;
					case '20062':
						$positem['type'] = 'Caldari Control Tower Small';
						break;	
					case '12236':
						$positem['type'] = 'Gallente Control Tower';
						break;	
					case '20063':
						$positem['type'] = 'Gallente Control Tower Medium';
						break;	
					case '20064':
						$positem['type'] = 'Gallente Control Tower Small';
						break;
					case '12235':
						$positem['type'] = 'Amarr Control Tower';
						break;	
					case '20059':
						$positem['type'] = 'Amarr Control Tower Medium';
						break;	
					case '20060':
						$positem['type'] = 'Amarr Control Tower Small';
						break;
					case '16214':
						$positem['type'] = 'Minmatar Control Tower';
						break;	
					case '20065':
						$positem['type'] = 'Minmatar Control Tower Medium';
						break;	
					case '20066':
						$positem['type'] = 'Minmatar Control Tower Small';
						break;
					default:
						$positem['type'] = 'Unknown Tower';
				}
//Auflösen der Systemnamen			
				switch($row['locationID'])
				{
					case '30003787':
						$positem['solarsystem'] = 'ABC';
						break;
					case '30003793':
						$positem['solarsystem'] = 'CDE';
						break;
					case '30003796':
						$positem['solarsystem'] = 'EFG';
						break;
					case '30003797':
						$positem['solarsystem'] = 'HIJ';
						break;
					case '30003799':
						$positem['solarsystem'] = 'KLM';
						break;
					case '30003800':
						$positem['solarsystem'] = 'STR';
						break;
					case '30003806':
						$positem['solarsystem'] = 'SAR';
						break;
					case '30045309':
						$positem['solarsystem'] = 'SRTZ';
						break;
					default:
						$positem['solarsystem'] = 'Unknown Solarsystem';
				}
//Auflösen der moonIDs
				switch($row['moonID'])
				{
					case '40239994':
						$positem['moon'] = 'ABC XII - Moon 5';
						break;
					case '40240368':
						$positem['moon'] = 'ABC IX - Moon 3';
						break;
					case '40240367':
						$positem['moon'] = 'ABC IX - Moon 2';
						break;
					case '40240358':
						$positem['moon'] = 'ABC VIII - Moon 12';
						break;
					case '40240311':
						$positem['moon'] = 'ABC I - Moon 1';
						break;
					case '40240542':
						$positem['moon'] = 'ABC VI - Moon 17';
						break;
					case '40240550':
						$positem['moon'] = 'ABC VIII - Moon 2';
						break;
					case '40240552':
						$positem['moon'] = 'ABC VIII - Moon 3';
						break;
					case '40240572':
						$positem['moon'] = 'ABC VI - Moon 1';
						break;
					case '40240588':
						$positem['moon'] = 'ABC VIII - Moon 9';
						break;
					case '40240664':
						$positem['moon'] = 'ABC III - Moon 2';
						break;
					case '40240734':
						$positem['moon'] = 'ABC V - Moon 16';
						break;
					case '40240743':
						$positem['moon'] = 'ABC VII - Moon 3';
						break;
					case '40240999':
						$positem['moon'] = 'ABC VI - Moon 17';
						break;
					case '40240978':
						$positem['moon'] = 'ABC VI - Moon 2';
						break;
					case '40240944':
						$positem['moon'] = 'ABC IV - Moon 2';
						break;
					case '40240985':
						$positem['moon'] = 'ABC VI - Moon 9';
						break;
					case '40240946':
						$positem['moon'] = 'ABC IV - Moon 4';
						break;
					case '40347784':
						$positem['moon'] = 'ABC V - Moon 1';
						break;
					case '40347764':
						$positem['moon'] = 'ABC IV - Moon 10';
						break;		
					default:
						$positem['moon'] = 'Unknown Location';
				}

				$cache_file_detail = $config['root_path'].'/tmp/cache/eveapi/starbaselistdetail'.$posnr.'.xml';			
				
				if(isset($params['cache_lifetime'])) 
				{
					$cache_lifetime = $params['cache_lifetime'];
				}

				if(!is_file($cache_file_detail) || (time() - filectime($cache_file_detail)) >= $cache_lifetime)
			    {
			        $datadetail = file_get_contents('https://api.eveonline.com/corp/StarbaseDetail.xml.aspx?keyID='.$keyID.'&vCode='.$vCode.'&itemID='.$positem['itemid']);
			        $posdetailxml = simplexml_load_string($datadetail); 
					
			        file_put_contents($cache_file_detail, $datadetail);
			
					$cacheddatadeep = 'No';
			    }
			    else 
				{
			        $posdetailxml = simplexml_load_file($cache_file_detail);
			
					$cacheddatadeep = 'Yes';
				}

				$posdetail = $posdetailxml->result->rowset;

				foreach ($posdetail->children() as $row) {
								
					switch($row['typeID'])
					{
						case '4051':
						case '4246':
						case '4247':
						case '4312':
							$positem['fuelblocks'] = $row['quantity'];
							break;
						case '16275':
							$positem['strontium'] = $row['quantity'];
							break;
						default:
							$posfuel['unknown'] = $row['quantity'];
					}
				}				
				$posnr++;
				
		$poslistnew[] = $positem;
	}	
	$smarty->assign('poslist', $poslistnew);
	//Next 4 vars for debug only
	$smarty->assign('cached', $cacheddata);		
        $smarty->assign('cacheddeep', $cacheddatadeep);
	$smarty->assign('cachedir', $cache_dir);
	$smarty->assign('cachetime', $cachetimestamp);	
}
function smarty_cms_help_function_poswatch() {
		echo 'Funktion zum &Uuml;berwachen der POSen<br />';
}
function smarty_cms_about_function_poswatch() {
		echo 'POS-Watch-Plugin V0.3 BETA';
}
?>

Ich überlege gerade, ob es Sinn macht bei der Detailabfrage auch den cacheduntil-Wert zu verwenden. Letztendlich wird es ja von der Übersichtsabfrage schon kontrolliert. (Dann würde ich den Zeitparameter (cache_lifetime) rausnehmen). Laut Api-Referenz, sind die Cache-Zeiten für Übersichtsabfrage und Detailabfrage identisch!

Als Randnotiz: Ja Switch-Case ist nicht die eleganteste Lösung. Es gibt DB-Dumps mit den gesamten Items, Systeme usw. Aber an die DB-Abfrage will ich mich erst später rantrauen. Außer der Code ist sehr übersichtlich... dann bin ich für Code-Schnipsel offen.

EDIT: Ich komme gerade auf die Idee, einfach den Zeitstempel (cached_until) von der Übersichts-Abfrage für die Detailabfrage auch zu verwenden!

Beitrag geändert von Tranquillius (25. April 2014 10:19)

Offline

#15 25. April 2014 08:37

Tranquillius
probiert CMS/ms aus
Ort: Leipzig
Registriert: 10. September 2013
Beiträge: 52

Re: Wie Cache in Plugin integrieren?

Ich habe es gleichmal umgebaut:

[== PHP ==]
<?php

function smarty_function_poswatch($params, &$smarty) { 
	
// Verifizierung wurde durch Dummydaten ersetzt!

        date_default_timezone_set('UTC');

	$keyID = '1234567';
	$vCode = '7oqrC6nJPmxLdfgh79456sdkhj98TRyLVrhjnhQWoXBVQik3XMZOH5Y';

	$config    = cmsms()->GetConfig();
	$cache_dir = $config['root_path'].'/tmp/cache/eveapi';
	
	if(!is_dir($cache_dir)) {
		mkdir($cache_dir, 0777, true);
	}	
	$cache_file = $cache_dir.'/starbaselist.xml';
	$cached_until = 0;

    if(is_file($cache_file))
    {
        $poslistxml = simplexml_load_file($cache_file);
        $cached_until = strtotime($poslistxml->cachedUntil);
		
		$cacheddata = 'Yes';
    }
    if(time() >= $cached_until)
    {
        $data = file_get_contents('https://api.eveonline.com/corp/StarbaseList.xml.aspx?keyID='.$keyID.'&vCode='.$vCode);
        $poslistxml = simplexml_load_string($data); 
        file_put_contents($cache_file, $data);
		
		$cacheddata = 'No';
    }
	
	$cachetimestamp = strtotime($poslistxml->currentTime);
	$poslist = $poslistxml->result->rowset;
	
	$posnr = 1;
	
	foreach ($poslist->children() as $row) {
		
		$positem = array(					
				'itemid' => $row['itemID'],
				'statetimestamp' => $row['stateTimestamp'],
				'onlinetimestamp' => $row['onlineTimestamp']
				);
//Auflösen des Status				
				switch($row['state'])
				{
					case '0':
						$positem['state'] = 'Unanchored';
						break;
					case '1':
						$positem['state'] = 'Offline';
						break;
					case '2':
						$positem['state'] = 'Onlining';
						break;
					case '3':
						$positem['state'] = 'Reinforced';
						break;
					case '4':
						$positem['state'] = 'Online';
						break;
					default:
						$positem['state'] = 'Unknown state';
				}
//Auflösen der typeIDs - Towertyp				
				switch($row['typeID'])
				{
					case '16213':
						$positem['type'] = 'Caldari Control Tower';
						break;
					case '20061':
						$positem['type'] = 'Caldari Control Tower Medium';
						break;
					case '20062':
						$positem['type'] = 'Caldari Control Tower Small';
						break;	
					case '12236':
						$positem['type'] = 'Gallente Control Tower';
						break;	
					case '20063':
						$positem['type'] = 'Gallente Control Tower Medium';
						break;	
					case '20064':
						$positem['type'] = 'Gallente Control Tower Small';
						break;
					case '12235':
						$positem['type'] = 'Amarr Control Tower';
						break;	
					case '20059':
						$positem['type'] = 'Amarr Control Tower Medium';
						break;	
					case '20060':
						$positem['type'] = 'Amarr Control Tower Small';
						break;
					case '16214':
						$positem['type'] = 'Minmatar Control Tower';
						break;	
					case '20065':
						$positem['type'] = 'Minmatar Control Tower Medium';
						break;	
					case '20066':
						$positem['type'] = 'Minmatar Control Tower Small';
						break;
					default:
						$positem['type'] = 'Unknown Tower';
				}
//Auflösen der Systemnamen			
				switch($row['locationID'])
				{
					case '30003787':
						$positem['solarsystem'] = 'ABC';
						break;
					case '30003793':
						$positem['solarsystem'] = 'CDE';
						break;
					case '30003796':
						$positem['solarsystem'] = 'EFG';
						break;
					case '30003797':
						$positem['solarsystem'] = 'HIJ';
						break;
					case '30003799':
						$positem['solarsystem'] = 'KLM';
						break;
					case '30003800':
						$positem['solarsystem'] = 'STR';
						break;
					case '30003806':
						$positem['solarsystem'] = 'SAR';
						break;
					case '30045309':
						$positem['solarsystem'] = 'SRTZ';
						break;
					default:
						$positem['solarsystem'] = 'Unknown Solarsystem';
				}
//Auflösen der moonIDs
				switch($row['moonID'])
				{
					case '40239994':
						$positem['moon'] = 'ABC XII - Moon 5';
						break;
					case '40240368':
						$positem['moon'] = 'ABC IX - Moon 3';
						break;
					case '40240367':
						$positem['moon'] = 'ABC IX - Moon 2';
						break;
					case '40240358':
						$positem['moon'] = 'ABC VIII - Moon 12';
						break;
					case '40240311':
						$positem['moon'] = 'ABC I - Moon 1';
						break;
					case '40240542':
						$positem['moon'] = 'ABC VI - Moon 17';
						break;
					case '40240550':
						$positem['moon'] = 'ABC VIII - Moon 2';
						break;
					case '40240552':
						$positem['moon'] = 'ABC VIII - Moon 3';
						break;
					case '40240572':
						$positem['moon'] = 'ABC VI - Moon 1';
						break;
					case '40240588':
						$positem['moon'] = 'ABC VIII - Moon 9';
						break;
					case '40240664':
						$positem['moon'] = 'ABC III - Moon 2';
						break;
					case '40240734':
						$positem['moon'] = 'ABC V - Moon 16';
						break;
					case '40240743':
						$positem['moon'] = 'ABC VII - Moon 3';
						break;
					case '40240999':
						$positem['moon'] = 'ABC VI - Moon 17';
						break;
					case '40240978':
						$positem['moon'] = 'ABC VI - Moon 2';
						break;
					case '40240944':
						$positem['moon'] = 'ABC IV - Moon 2';
						break;
					case '40240985':
						$positem['moon'] = 'ABC VI - Moon 9';
						break;
					case '40240946':
						$positem['moon'] = 'ABC IV - Moon 4';
						break;
					case '40347784':
						$positem['moon'] = 'ABC V - Moon 1';
						break;
					case '40347764':
						$positem['moon'] = 'ABC IV - Moon 10';
						break;		
					default:
						$positem['moon'] = 'Unknown Location';
				}		
				
				$cache_file_detail = $cache_dir.'/starbaselistdetail'.$posnr.'.xml';		

				if(is_file($cache_file_detail))
				{
					$posdetailxml = simplexml_load_file($cache_file_detail);				
					$cacheddatadeep = 'Yes';
				}
				if(time() >= $cached_until)
				{
			        $datadetail = file_get_contents('https://api.eveonline.com/corp/StarbaseDetail.xml.aspx?keyID='.$keyID.'&vCode='.$vCode.'&itemID='.$positem['itemid']);
			        $posdetailxml = simplexml_load_string($datadetail); 			
			        file_put_contents($cache_file_detail, $datadetail);
					
					$cacheddatadeep = 'No';
				}

				$posdetail = $posdetailxml->result->rowset;

				foreach ($posdetail->children() as $row) {
								
					switch($row['typeID'])
					{
						case '4051':
						case '4246':
						case '4247':
						case '4312':
							$positem['fuelblocks'] = $row['quantity'];
							break;
						case '16275':
							$positem['strontium'] = $row['quantity'];
							break;
						default:
							$posfuel['unknown'] = $row['quantity'];
					}
				}				
				$posnr++;
				
		$poslistnew[] = $positem;
	}	
	$smarty->assign('poslist', $poslistnew);
	//Next 4 vars for debug only
	$smarty->assign('cached', $cacheddata);		
        $smarty->assign('cacheddeep', $cacheddatadeep);
	$smarty->assign('cachedir', $cache_dir);
	$smarty->assign('cachetime', $cachetimestamp);	
}
function smarty_cms_help_function_poswatch() {
		echo 'Funktion zum &Uuml;berwachen der POSen<br />';
}
function smarty_cms_about_function_poswatch() {
		echo 'POS-Watch-Plugin V0.3 BETA';
}
?>

Beitrag geändert von Tranquillius (25. April 2014 10:20)

Offline