Externe Serverzugriffe mit PHP5 mächtig lahmarschig

28 04 2007

Was macht man, wenn man ein Forum eines Foren-Hosters einsetzt, der keinen direkten Zugriff auf seine Daten bietet, man aber trotzdem auf einer Seite gesammelt die neuesten Threads im Überblick anbieten möchte? Viele Möglichkeiten gibt es nicht, ich habe mir als ich einst in der Lage war ein Portal für ein Rapidforum zu basteln damit beholfen, die wichtigsten HTML-Seiten vom Forum mit file_get_contents() zu holen und anschließend zu verarbeiten.Das funktionierte auch prächtig, bis vor ein paar Tagen fast nichts mehr ging. Doch, es funktionierte schon noch, aber so enorm langsam, dass einem das Gesicht einschlief beim Warten auf die generierte Seite. Nachdem der Fetch-Vorgang von der Seite fast das Einzige sein konnte was wirklich Performance frisst war schnell ein Testskript gebastelt, welches einfach ein paar Webseiten abgriff. Siehe da, ein einziger Zugriff auf das Forum dauerte über 15 Sekunden.

Um sicherzustellen, dass der Forenbetreiber keine Hürde eingebaut hatte um solche Zugriffe zu unterbinden gleich noch mit ein paar anderen URLs getestet, das Ergebnis war immer ziemlich ähnlich. Das Test-Skript zur eigenen Verwendung.

<?php

$a_urls = array('http://www.google.de/', 'http://www.yahoo.com/', 'http://6736.rapidforum.com/');

foreach ($a_urls as $url){
	$grab = '';
	$zeit_file = microtime(true);
	$grab = file($url);
	$zeit_file = round (microtime(true) - $zeit_file, 3);

	$grab = '';
	$zeit_fgc = microtime(true);
	$grab = file_get_contents($url);
	$zeit_fgc = round (microtime(true) - $zeit_fgc, 3);

	$grab = '';
	$zeit_fread = microtime(true);

	$handle = fopen($url, "r");
	while (!feof($handle)) {
		$grab .= fread($handle, 8192);
	}
	fclose($handle);

	$zeit_fread = round (microtime(true) - $zeit_fread, 3);

	echo <<<ausgabe
	

Laufzeiten für $url
file: $zeit_file Sekunden
file_get_contents: $zeit_fgc Sekunden
fread: $zeit_fread Sekunden

AUSGABE; } ?>

Die zu testenden URLs sind im ersten Parameter anzupassen. Die Ergebnisse sahen bei mir allesamt erschreckend aus. Zum Vergleich, von meinem lokalen Testserver dauerte keine der Abfragen auch nur annähernd eine Sekunde.

Laufzeiten für http://www.google.de/
file: 10.881 Sekunden
file_get_contents: 10.516 Sekunden
fread: 10.35 Sekunden
Laufzeiten für http://www.yahoo.com/
file: 13.108 Sekunden
file_get_contents: 10.487 Sekunden
fread: 11.112 Sekunden
Laufzeiten für http://6736.rapidforum.com/
file: 16.218 Sekunden
file_get_contents: 15.74 Sekunden
fread: 16.484 Sekunden

Mein Hoster erzählte mir auf Nachfrage, das liege an der neuen PHP Version. Originalzitat:
Es gibt derzeit Probleme mit der PHP5 Etch Version. Wir haben das bereits im Bugtracker gemeldet.
Nun stellt sich mir nur noch die Frage, wo der Fehler gemeldet wurde. Im PHP Bugtracker finde ich nämlich keinen aktuellen Bugreport, der zu diesem Fehler passt. Wie dem auch sei, ich musste mir etwas anderes überlegen.

Sinnvollerweise hatte ich in mein Skript eine Caching-Funktion eingebaut, da ich für jeden Aufruf drei Seiten des Forums abfragen musste. Man kann sich vorstellen was das bedeutete, wenn es relativ hohen Traffic mit zehn und mehr Besuchern auf dem Portal gab. Schnell wurde meine Server-IP als Spammer vom Forum ausgesperrt. Dies umging ich damit, dass die verarbeitete Seite auf meinem Server gespeichert wurde und bei jedem Aufruf geprüft wurde, ob die Daten älter als eine Minute waren. Wenn ja, wurden die Daten aktualisiert, wenn nicht nur die alte Seite ausgegeben.

Nun habe ich den Update-Vorgang ausgelagert und rufe diesen per Cron alle fünf Minuten auf. Mehr wollte ich nicht einstellen, da der rund um die Uhr läuft und nicht nur wenn Verkehr auf dem Portal ist. Wäre also ein unnötiger Overhead. Zudem rennt das Update bei den aktuellen Geschwindigkeiten alleine schon ca. eine Minute. Bei zu häufigen Updates würde es sich vermutlich irgendwann überschlagen. Da ich den Update-Befehl nach wie vor in einer Remote aufrufbaren PHP Datei habe und diese nicht für den direkten Aufruf umbauen wollte, hole ich mir die Datei einfach mittels wget vom Server:

0,5,10,15,20,25,30,35,40,45,50,55 * * * * wget http://www.domain.de/update.php

Update vom 02.05.:
Mein Hoster war so nett die Testdatei auf seinen Server zu kopieren. Der ist ähnlich aufgebaut wie der Meinige, läuft allerdings noch unter PHP4. Siehe da, hier funktioniert alles so wie gewünscht. Zum Vergleich die Testergebnisse.

Laufzeiten für http://www.google.de/
file: 0.052 Sekunden
file_get_contents: 0.053 Sekunden
fread: 0.068 Sekunden
Laufzeiten für http://www.yahoo.com/
file: 0.523 Sekunden
file_get_contents: 0.753 Sekunden
fread: 0.044 Sekunden
Laufzeiten für http://6736.rapidforum.com/
file: 0.098 Sekunden
file_get_contents: 0.787 Sekunden
fread: 0.054 Sekunden
Advertisements

Aktionen

Information

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s




%d Bloggern gefällt das: