PHP Webseitenteil Cachen

McCoRmIcK

Cadet 4th Year
Registriert
Jan. 2004
Beiträge
118
Hallo

Ich bin auf der suche nach einem Script,Turorial oder Codeschnippsel was mir dabei hilft einen bestimmten Teil einer Webseite zu cachen.

Senario wie folgt
Eine Webseite besteht aus header.php content.php und footer.php
content.php bindet header und footer zusammen und bildet die fertige seite.
Jetzt möchte ich nur die Ausgabe von content.php in einer Datei abspeichern und laden.
 
smarty kann das, ist aber sehr mächtig und kann (zu) viel overhead erzeugen
 
Dauert das Berechnen der content.php denn so lange, dass es sich lohnt?

Es gibt viele Möglichkeiten Daten zu cachen, eine Googlesuche nach "PHP caching" wird dir einige Möglichkeiten aufzeigen, von denen du dir eine aussuchen musst. Vor allem kennen wir ja nicht deine genauen Bedürfnisse oder was dir an Software zur Verfügung steht. Oder unsere Empfehlungen sind gar oversized weil memcached nachher mit Kanonen auf Spatzen schießen ist...
 
Es dreht sich um die Internetseite unseres Familienbetriebs die ich baue/verwalte/stricke. Und einige Seiten haben leider soviel Inhalt der aus der MySQL Datenbank geladen wird das ein Seitenaufruf schonmal 20sek dauert. Cachen einer kompletten Seite bekomme ich auch hin, nur gibt es halt Teile die nicht gecached werden dürfen weil Sie je z.b. je nach Uhrzeit anders sind.

Unser Hoster ist Domainfactory und wir haben dort den Tarif ManagedHosting 6-Sterne-Performance
http://www.df.eu/de/archiv/1101/managedhosting/
 
also wenn wirklich das berechnen der Seite 20sek dauert solltest du nochmal genau nachschauen was du da alles machst und mal messen was genau soviel Zeit braucht. Oder ist der Inhalt der Seite so groß das die Übertragung zum Browser so lange dauert?
 
Am einfachsten wäre es wohl, das, was du cachen willst, in der Datenbank zu speichern. Dann mußt du nicht mit Dateien herumhantieren.

Und ja, 20 Sekunden ist schon extrem...
 
An der Größe der Datei liegt es nicht. Es liegt an zwei Datenbankabfragen die verschachtelt sind. Und wenn die erste Abfrage viel liefert, dauerts eben. Glaube aber auch nicht das es an meinen Selects liegt oder an der Konstruktion des Scripts. Es ist nichts besonderes nur die Datenmenge ist schlicht hoch.

PHP:
$abfrage1 = "SELECT distinct text2,klartext_og,klartext_hg,klartext_ug,a_hersteller,alias, alias_id FROM $x_artikel where geh_zu_art = 'auspuff' and geh_zu_ug_id = '$katalog_ug' order by text2";
$erg1 = mysql_query($abfrage1);
while ($artikel1 = mysql_fetch_array($erg1)) {

echo "ausgabe";

$abfrage2 = "SELECT top,a_endrohre,a_durchmesser,artikelnr,preis,alias FROM $x_artikel where geh_zu_art = 'auspuff' and geh_zu_ug_id = '$katalog_ug' and text2 = '$text2' order by artikelnr";
$erg2 = mysql_query($abfrage2);
while ($artikel2 = mysql_fetch_array($erg2)) {

echo "ausgabe";

}
}
 
$text2 ist der Wert aus der vorherigen Abfrage?

außerdem verstehe ich nicht genau warum du zwei verschiedene Abfragen machst $x_artikel ist immer gleich? sollte es nicht reichen wenn du bei der ersten abfrage alle felder von der ersten und zweiten Abfrage holst und zusätzlich noch nach artikelnr sortierst? die erste abfrage sollte doch schon alle ergebnisse enthalten, in der zweiten abfrage holst du nur noch immer wieder eine teilmenge von der ersten abfrage aus der DB, warum?

Bei MySQL ist es fast immer besser eine große abfrage zu machen als viele kleine, da MySQL die Abfrage dann intern besser optimieren kann
 
Hast du überhaupt einen Index auf die Spalten gesetzt? Denn das sind keineswegs Anfragen, die lange dauern dürften.

Einen Query in einer Schleife zu machen ist böse! Bitte schau dir Joins an, verstehe sie, und deine Seite wird in Zukunft wieder in wenigen Millisekunden berechnet sein.
 
das mit dem Index sollte erstmal zweitrangig sein, erstes Ziel sollte sein alles mit einer Abfrage hinzugbekommen. Da wohl keine Joins wird der Index die geschwindigkeit nicht so stark beeinflussen wie die vielen zusätzlichen Abfragen an die DB.
 
Kenne Joins etc, aber der Aufbau der Seite läßt es glaube ich nicht zu. Aber zurück zum eigentlichen Thema.

PHP:
<?php
$cacheDir = "../cachedir/";
$cacheTime = 60*60*24;
$cacheFile = $cacheDir.str_replace("/","|",$_SERVER['REQUEST_URI']);

if(file_exists($cacheFile) && (time() - filemtime($cacheFile)) < $cacheTime){
	echo file_get_contents($cacheFile);
}else{
	ob_start();
?>

Cache Bereich

<?php
	file_put_contents($cacheFile,ob_get_contents());
	ob_end_flush();
}
?>

Ich glaube damit es e schon getan oder kommt es zu irgendwelchen Problemen?
 
McCoRmIcK schrieb:
Kenne Joins etc, aber der Aufbau der Seite läßt es glaube ich nicht zu.

Doch dein Query mit dem Query in der Schleife lässt sich wunderbar als Join formulieren, und schwups werden alle Geschwindigkeitprobleme weg sein und du benötigst kein Cachen mehr.

Cachen um Performance-Probleme der Programmierung zu beheben ist (mit Verlaub) die dämlichste Idee.



Edit: täusche ich mich oder sollen die beiden Querys einfach folgendes simples bewirken:
Code:
SELECT ... FROM $x_artikel where geh_zu_art = 'auspuff' and geh_zu_ug_id = '$katalog_ug' and text2 = '$text2' order by text2, artikelnr
(kein Join, Sortierung nach 2 Attributen)
 
Zuletzt bearbeitet:
wenn es wirklich nur um diese Abfrage geht solltest du das mit dem caching erstmal vergessen, weils mehr aufwand im nachhinein bedeutet.

Warum rufst du denn in der zweiten Abfrage immer wieder eine Teilmenge von dem ersten Ergebnis ab?

Einfach bei der ersten Abfrage alles holen und dann nur noch in PHP das Ergebnis verarbeiten

ich denke das nicht mal JOINS nötig sind es kommt ja alles aus der gleichen tabelle
 
$text2 kommt aus der ersten abfrage. Verstehe schon was ihr meint. Es muss mit einer Abfrage gehen und auch ohne ein Join weil es ja nur eine Tabelle ist. Nur mit zwei Abfragen ist die weiter verarbeitung für mich viel leichter. Kann sein das ich einfach was Blind bin grade und nicht sehe wie es anders besser geht.

Die erste Abfrage erstellt eine HTML Tabelle mit einer "Überschrift($text2 aus dem ersten select)". Die zweite Abfrage füllt die HTML Tabelle dann mit Zeilen.

Also hab ich auf meiner Seite dann paar HTML Tabellen untereinander stehen und kann durch die Schleifen ganz einfach immer eine neue HTML Tabelle starten. Wenn ich alles mit einer Abfrage hole, müsste ich evtl. mit nem Array alles lösen.
 
hab ich mir schon gedacht, wenn du noch nach Hersteller sortierst und mit einer IF abfrage prüfst ob bei einer neuen Zeile ein neuer Hersteller kommt, dann alte Tabelle zu und neue Aufmachen, wenn der hersteller noch der gleiche wie von der Zeile davor ist dann einfach der Tabelle eine neue Zeile hinzufügen.
 
ok ich seh es ein ;) ich versuch mal das ganze auf eine abfrage um zu bauen ^^

aber troztdem nochmal die frage zu dem geposteten php code zum cachen. gibt es da probleme die ich noch nicht erkenne?
Ergänzung ()

Die Abfrage komplett mit einem select dauert 0.1803 sek und liefert 435 zeilen
Ich bau mal schnell um :D
 
Zurück
Oben