PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Tutorial] Mediadaten Cachen



Gremlin
10.05.2008, 14:43
Hallo,
in meinem letzten Tutorial habe ich beschrieben wie man einen Statpicker mit Cache erstellt, heute möchte ich zeigen wie ihr eure Mediadaten cachen könnt. Die Erzeugung der Mediadaten kann unter Umständen viel Last für den Server verbrauchen jenachdem wieviele Statistiken dort angezeigt werden deshalb ist es sinnvoll wenn man die Mediadaten z.B. nur alle 15 Minuten neu generiert.

Das Cachen der Mediadaten ist in wenigen Schritten erledigt und benötigt nicht viel arbeit.

Systemvorraussetzungen
- PHP >= 5

1) Cache Verzeichnis erstellen
Wir brauchen wieder ein Verzeichnis wo wir die Mediadaten zwischenspeichern wer das letzte Tutorial schon gemacht hat der besitzt bereits das Verzeichnis "dynamic_cache" im Hauptverzeichnis vom VMS. Wer dies noch nicht hat muss es noch erstellen und chmod777 vergeben.


2) Cache in Mediadaten einbauen

In der Datei /content/intern/mediadaten.php muss man nun den Cache einbauen, dafür prüft man zum einen am Anfang der Datei wieder ob die Cache-Datei existiert und ob sie veraltet ist das ganze geschieht mit:


if (!file_exists('dynamic_cache/mediadaten.txt') || @filemtime('dynamic_cache/mediadaten.txt') < time()-600)
{Die 600 steht dabei wieder für die Zahl der Sekunden in der die Mediadaten neu erstellt werden sollen (Hier 10 Minuten).

Wenn die Datei nicht existiert oder veraltet ist starten wir wieder den internen php Puffer wo die Ausgaben drin gespeichert werden das ganze wieder mit:


ob_start();Nach den ganzen Ausgaben schreiben wir dann noch den Inhalt vom Puffer in die Cache Datei mit:


file_put_contents('dynamic_cache/mediadaten.txt', ob_get_flush() ); Zu guter letzt kommt noch der Teil aus der else Schleife mit dem wir - sofern vorhanden - die gecachten Mediadaten laden und ausgeben:


}else{
echo file_get_contents('dynamic_cache/mediadaten.txt');
}Das wars auch schon :biggrin1:

Der Mediadaten Cache darf gratis in Verbindung mit dem VMS1.x genutzt werden.

Gruß
Gremlin

Ps.: Wer mir was spenden will dafür kann es gerne tun!
Klammid: 184974
PrimusPortal Nick: Gremlin
PayPal: gremlincomputer [at] gmx [punkt] de
Ich freue mich auch über Backlinks von eurer Homepage hierzu könnt ihr diesen Code nutzen:


<a href="http://www.joke-factory.de" title="Witze" rel="follow">Witze</a>

Dreamerweb
10.05.2008, 18:11
Hallo

Habe das bei mir mal getestet.

Es wird im Verzeichnis dynamic_cache zwar eine Datei erstellt mediadaten.txt aber die datei ist leer. ist das so richtig? Eher nicht glaube ich mal.

Gremlin
10.05.2008, 18:32
Nein das ist nicht korrekt kannst du mal deine mediadaten.php posten? Gerne auch per PM.

Gruß
Gremlin

Holstenjungs
10.05.2008, 18:39
Wer das ganze auch mit php4 benutzen will, der sollte folgendes in die Datei einfügen:


if (!function_exists('file_put_contents')) {
function file_put_contents($filename, $data) {
if (($h = @fopen($filename, 'w')) === false) {
return false;
}
if (($bytes = @fwrite($h, $data)) === false) {
return false;
}
fclose($h);
return $bytes;
}
}

Dreamerweb
11.05.2008, 05:51
Nein das ist nicht korrekt kannst du mal deine mediadaten.php posten? Gerne auch per PM.

Gruß
Gremlin

Hallo

Dank Dir jetzt läuft es auch bei mir. War mein eigener Fehler.

Hatte diese Zeile


file_put_contents('dynamic_cache/mediadaten.txt', ob_get_flush() ); nicht ans ende sondern noch am Anfang stehen. :frusty:

Benutzer1699
11.05.2008, 07:01
Ich halte 15 Minuten für übertrieben, halbe Stunde oder Stunde wäre eine Zeit mit der Server und Besucher denke ich gut leben können *g* - aber das wollte ich gar nicht.

Mir ist noch die Idee gekommen, dass man die Generierung des Nachts oder des Tages (je nach Userverhalten) häufiger bzw. seltener laufen lassen könnte.
Optimalerweise automatisch per Cronjob, damit man nicht auf einen Aufruf angewiesen ist.

@Gremlin:
Daumen hoch für die Mindestvorraussetzung von PHP5 hehe.

Gremlin
11.05.2008, 12:43
Daumen hoch für die Mindestvorraussetzung von PHP5 hehe.
PHP4 hab ich nicht und will ich nicht deshalb PHP5 *g Holstenjungs hat aber ja ein Workaround geschrieben :thumb:

Holstenjungs
11.05.2008, 14:45
Das habe ich nicht geschrieben, diese Funktion ist die Standardfunktion für php4. Also für die Leute die es da benutzen wollen. Das ist auch zuhauf bei Google zu finden oder sogar in einem PHP Handbuch. ;)

MfG

SebbyPHM
08.06.2008, 01:42
da ich das so ca auch benötige zukünfitg, hier mal meine kleine sache
>> damit verschwindet diese elendige if-else-bdingung =)


php5:

<?php
function start_cache ($name, $time=900) {
if (!file_exists ('cache/'.$name) || filemtime ('cache/'.$name) < (time()-$time)) ob_start ();
else {
file_get_contents ('cache/'.$name);
require ('lib/footer.php'); // fuer das VMS den Footer einbinden
exit; // ... und anschliessen alles beenden
}
$GLOBALS['cachename'] = $name;
}

function end_cache () {
if (isset ($GLOBALS['cachename'])) file_put_contents ('cache/'.$GLOBALS['cachename'], ob_get_flush ());
}
?>


php4:

<?php
function start_cache ($name, $time=600) {
if (!file_exists ('cache/'.$name) || filemtime ('cache/'.$name) < (time()-$time)) ob_start ();
else {
echo implode ('', file('cache/'.$name));
require ('lib/footer.php'); // fuer das VMS den Footer einbinden
exit; // ... und anschliessen alles beenden
}
$GLOBALS['cachename'] = $name;
}

function end_cache () {
if (isset ($GLOBALS['cachename'])) {
$f = @fopen ('cache/'.$GLOBALS['cachename'], 'w') or die ('Kann Cache-Datei nicht oeffnen.');
fwrite ($f, ob_get_contents ());
fclose ($f);
}
}
?>

aufruf:

<?php
start_cache ('test', 10);
echo 'Diese Datei wurde das letzte mal am '.date('d.m.Y').' um '.date('H:i:s').' Uhr ge&auml;ndert.';
end_cache ();
?>