Homepage selbermachen 7.852 Themen, 35.619 Beiträge

An die Insider PHP - Seite statisch machen

Der_Milchmann / 15 Antworten / Baumansicht Nickles

Hallo,

ich habe eine Seite, die aus einer counter Tabelle Tausende von Daten ausliest (MySQL) - .soweit alles klar. allerdings wird die tabelle von hunderten von usern täglich mehrmals ausgelesen, das alles auch noch abends, daher soll die tabelle lediglich beim ersten aufruf aktualisiert werden - also einmal am tag.


Bevor ich anfange, wollte ich fragen, ob ich einen Denkfehler mache. Folgenden Workflow habe ich vor:


  • Morgends wird die Tabelle das erste mal aufgerufen...
  • in einer separaten textdatei liegen 2 Datumsangeben vor - eine vom letzten Aufruf und das aktuelle Datum.
  • Beide Datumsangaben (z.b. der form 2004-05-24) werden verglichen und wenn der Tag des letzten Aufrufs älter ist als der aktuelle, so wird die Textdatei geupdatet und erhält nun in Zeile 2 die Info, dass das Datum HEUTE den letzten Aufruf zeigt, die Textdatei sieht nun also so aus: 2004-05-24 (Zeile1) und das gleiche Datum auch in zeile2
  • Textdatei wird also geupdatet und weiter gehts
  • das richtige Script wird abgearbeitet, das dauert eben beim ersten mal länger und der komplette statische code wir mit fwrite etc in eine Text/HTML Datei geschrieben, die dann statisch vorliegt.
  • Wenn jetzt der Zweite user kommt, wird die Textdatei wieder aufgerufen
  • Jetzt aber werden die 2 Zeilen der Textdatei wieder verglichen und festgestellt, dass das Datum gleich ist, das Script also schonmal aufgerufen wurde.
  • in diesem Falle rutscht die IF Klausel weiter und statt dem eigentlichen Script, wird dieses nicht abgearbeitet, sondern die statische textdatei aufgerufen, was natürlich jetzt wesentlich weniger den server durchrütteln lässt.



Frage: Geht das in Ordnung (technisch habe ich keine Fragen, was den oben angegebenen Workflow angeht) nur obs logisch ist und klappen könnte, ist noch fraglich.

Gruss Milchmann
-----------------------------------Zu Hartz4 kann ich nur sagen, dass ich froh bin, dass ich einen Job habe
bei Antwort benachrichtigen
xafford Der_Milchmann „An die Insider PHP - Seite statisch machen“
Optionen

Warum so umständlich?


  • Script schaut nach, welches Erstellungsdatum die Seite counter.html hat

  • Datum von heute? -> Per include einbinden

  • Datum des vorherigen Tages? -> Neu erstellen und einbinden

Pauschalurteile sind immer falsch!!!
bei Antwort benachrichtigen
Der_Milchmann xafford „Warum so umständlich? Script schaut nach, welches Erstellungsdatum die Seite...“
Optionen

Aber die statische Seite muss in jedem Fall irgendwie erstellt werden oder wie siehst du das

-----------------------------------Zu Hartz4 kann ich nur sagen, dass ich froh bin, dass ich einen Job habe
bei Antwort benachrichtigen
xafford Der_Milchmann „Aber die statische Seite muss in jedem Fall irgendwie erstellt werden oder wie...“
Optionen

Ja klar muß sie. Ich finde nur deinen Ansatz mit den zwei Daten etwas seltsam, das Datum der Dateierstellung liefert Dir ja schon das Dateisystem und die aktuelle Zeit hast Du auch verfügbar, insofern kannst Du dein Script auch einfach die beiden Daten vergleichen lassen und wenn die Datei aktuell genug ist diese einfach per Include einbinden.
Wenn sie zu alt ist erstellst Du über dein Script eine neue Version.

Pauschalurteile sind immer falsch!!!
bei Antwort benachrichtigen
Der_Milchmann xafford „Ja klar muß sie. Ich finde nur deinen Ansatz mit den zwei Daten etwas seltsam,...“
Optionen

Vielen Dank also für den Tipp mit der Systemzeit, das erspart mir das rumgeeier mit den einzelnen textfiles.

Hier mal meine neue Idee (ohne direkte php befehle):


  • Besucher kommt auf die Seite
  • if($datum_der_datei {
    Script normal abarbeiten und am Ende in Textfile schreiben
    }
  • elseif($datum_der_datei == $heute)
    {
    include (textdatei.php);
    }


Wobei mir jetzt auffällt dass ich hänge ... wie würdest du am "sinnvollsten" den _gesamten_ dynamisch erzeugten Inhalt der PHP Datei in eine statische schreiben? Einfach mit fwrite, quasi als normalen Inhalt einfügen oder gibts sinnvollere Methoden hierzu?

Gruss und Danke Milchmann
-----------------------------------Zu Hartz4 kann ich nur sagen, dass ich froh bin, dass ich einen Job habe
bei Antwort benachrichtigen
Der_Milchmann xafford „Ja klar muß sie. Ich finde nur deinen Ansatz mit den zwei Daten etwas seltsam,...“
Optionen

Ich hatte folgendes Script versucht, was leider nicht funktioniert:


$filename = "statistik.php";

$fp = fopen ($filename, "r");
$inhalt = fread ($fp, filesize ($filename));


$filename = "testfile.html";
$schreiben = "$inhalt";
$fp = fopen ($filename, "w");
fwrite ($fp, $schreiben);
fclose ($fp);
?>


Der Transfer klappt zwar, nur gehen die Serverdaten in die Datei testfile.htm über , nicht die, die der Client sieht, das heisst, ich würde MySQL Passwort etc etc preisgeben - das hab ich garnicht mit bedacht, doch wie gekomme ich die Client-Daten in die Datei

-----------------------------------Zu Hartz4 kann ich nur sagen, dass ich froh bin, dass ich einen Job habe
bei Antwort benachrichtigen
xafford Der_Milchmann „Nachtrag - klappt nicht“
Optionen

Okay, hier mal ein schematischer Ansatz, wie ich es lösen würde.
Erst einmal ist es sinnvoll (in meinen Augen) das ganze in zwei (bzw 3 mit den Inhalten) aufzuteilen.

datei 1 (Entschedatei)
$sNow=date("j",time());
$sFileDate=date("j",filetime("inhalt.txt"));
if($sNow==$sFileDate)
{
include("inhalt.txt");
}
else
{
include("generate.php");
}

Datei2 (Datei generieren und einbinden):
// Daten aus der Datenbank holen und in String packen (Logik kenne ich nicht
$sInhalt="dein Inhalt";
if($fp=fopen("inhalt.txt","w"))
{
flock($fp,2);
fwrite($fp,$sInhalt);
flock($fp,3);
fclose($fp);
include("inhalt.txt");
}
else
{
// Fehlerbehandlung
}

Pauschalurteile sind immer falsch!!!
bei Antwort benachrichtigen
Borlander xafford „Nachtrag - klappt nicht“
Optionen
$sNow==$sFileDate
Sollte zwar eigentlich nicht vorkommen, aber wenn die Seite vorher einen Monat lang nicht aufgerufen wurde bekommt der Besucher eine alte Seite. Mit z.B. "z;y" sollte dieser Fall auf absehbare Zeit ausgeschlossen sein ;-)

include("inhalt.txt");
Da auch eine frisch generierte Seite damit ausgegeben wird würde es sich anbieten diese Anweisung nach IF..ELSE in datei 1 zu plazieren (redundanz vermeiden), oder bei einer neu erzeugten Datei direkt die Variable $sInhalt auszugeben - die ist schließlich noch im Speicher ;-)


Gruß
bor
bei Antwort benachrichtigen
Borlander Der_Milchmann „Nachtrag - klappt nicht“
Optionen

Also so kann das auch nicht funktionieren - Du machst nichts anderes als den Inhalt Datei statistik.php in die Datei testfile.html zu kopieren...

Du must den (statischen) Inhalt den testfile.html bei Bedarf (dynamisch) in der statistik.php erzeuegen (Also DB-Abfrage und die Ergebnismenge nicht per echo ausgeben sondern an eine (String) Variable anhängen die Du am Ende des Vorgangs in die testfile.html schreibst)...


Gruß
Borlander

bei Antwort benachrichtigen
Der_Milchmann Borlander „Nachtrag - klappt nicht“
Optionen

Wie ist es bei komplexen STrukturen möglich, den gesamten INhalt in eine Variable zu packen??!! Das hiesse ja, dass ich jedesmal wenn ich echo habe, nehmen wir mal diesen Beispielteil:

echo"
<table border=\"0\" width=\"100%\" cellpadding=\"4\">
<tr><td colspan=\"2\" height=\"26\" id=\"over\">Übersicht der aktuelle Woche </td></tr>
";
while($zeile=mysql_fetch_object($woche_aktuell))
{
echo"
<tr><td"; if($highest->besucher == $zeile->besucher) { echo" id=\"text_bunt\" "; } echo" width=\"50%\">"; echo translate($zeile->datum_format); echo"</td><td"; if($highest->besucher == $zeile->besucher) { echo" id=\"text_bunt\" "; } echo" width=\"50%\">$zeile->besucher Besucher</td></tr>
";
}
echo"
</table>

<br>
<br>
";

Dieses Gewühl an Ausgabe und programmierung kann ich doch unmöglich in eine Variable packen oder?

-----------------------------------Zu Hartz4 kann ich nur sagen, dass ich froh bin, dass ich einen Job habe
bei Antwort benachrichtigen
xafford Der_Milchmann „Riesenchaos, wenn ich jede einzelne Zeile in eine Variable packe“
Optionen

Natürlich geht das:

$sMyString='';
while($r=mysql_fetch_assoc())
{
$sMyString.=$r["irgendwas"];
}

Du kannst natürlich alternativ auch die Datei vor deiner Ausgabe öffnen und jeden Teil der Ausgabe zeilenweise in die Datei schreiben, von der Alternative würde ich aber aufgrund der Kosten abraten, da File-Zugriffe wesentlich langsamer sind.

@Bor: Quick&Dirty-Lösungen verbessern is gemein ;O)

Pauschalurteile sind immer falsch!!!
bei Antwort benachrichtigen
Der_Milchmann xafford „Riesenchaos, wenn ich jede einzelne Zeile in eine Variable packe“
Optionen

verstehe ich nicht, somit muss ich ja dennoch $sMyString.= vor jede Zeile HTML schreiben bzw. vor jede Zeile, die mal als HTML ausgegeben werden soll oder wie ist dein beispiel gemeint?

-----------------------------------Zu Hartz4 kann ich nur sagen, dass ich froh bin, dass ich einen Job habe
bei Antwort benachrichtigen
xafford Der_Milchmann „Riesenchaos, wenn ich jede einzelne Zeile in eine Variable packe“
Optionen

Ich verstehe jetzt deine Frage nicht. Ersetze einfach alles, wo derzeit echo steht mit $sMyString um die Ausgabe nicht an den Browser, sondern in die Variable zu senden. HTML generierst Du ja sowieso.
Eleganter ist das Ganze natürlich mit entsprechenden Templates.

Pauschalurteile sind immer falsch!!!
bei Antwort benachrichtigen
Der_Milchmann xafford „Riesenchaos, wenn ich jede einzelne Zeile in eine Variable packe“
Optionen

Hallo

ich habe es dank euren guten Tipps hinbekommen. Vielen Dank

Ohne eure Tipps sässe ich heute noch da!

Da die STatistik jeden Tag aufgerufen wird reicht ein Check des Tages der Datei, das heisst, einen umständlichen timestamp brauch ich garnicht machen, ich checke nur, ob die Datei älter ist oder neuer mittels if(date ("d", filemtime($filename))

Also ich bedank mich nochmal !

Das Ausgeben der Statischen DAtei geht jetzt wahnsinnig schnell für die übrigen 100 User, nur der 1. hat immer etwas zu warten ;)

-----------------------------------Zu Hartz4 kann ich nur sagen, dass ich froh bin, dass ich einen Job habe
bei Antwort benachrichtigen
Borlander Der_Milchmann „Klappt - Vielen Dank an euch beide“
Optionen
date ("d", filemtime($filename))
Das geht am Monatsanfang schief... 31 ! Also besser mit = prüfen und statdessen lieber "z;y" (Tag_des_Jahres;Jahr) verwenden...

Gruß
Borlander
bei Antwort benachrichtigen
Zaphod Borlander „“
Optionen

... deshalb hatte ich ihm ja auch im Chat geraten, mit Timestamps zu arbyten :-( ...
Gruß, Z.

bei Antwort benachrichtigen