Ich frage auf einer Seite, auf der man seine Homepage eintragen kann, per fopen() ab, o dieser existiert bzw. erreichbar ist. Das klappt auch wunderbar, lokal mit internetverbindung über ISDN verzögert sich der seitenaufbau nur um 2-3 Sekunden, was ich tollerieren kann. Aber nur solange es die Seite gibt. wenn sie nicht existiert, dauert es teilweise über zwanzig sekunden, bis die Seite weiter aufgebaut wird. Und das sieht _sehr_ unschön aus.
Jetzt meine Frage: gibt es eine Möglichkeit, einer Funktion nur eine bestimmte Zeitspanne zur Verfügung zu stellen?
Für eine nicht-existierende Homepage-Adresse gibt es drei Möglichkeiten:
1. Die Datei existiert nicht auf dem angegebenen Server.
2. Auf dem Server läuft kein Webserver, oder er ist blockiert.
2. Der Server, besser: die Domain, ist unbekannt.
In ersterem Fall solltest Du eigentlich sofort eine Antwort bekommen, der Server ist ja da und kann dementsprechend eine Fehlermeldung ausspucken.
Im zweiten Fall und dritten Fall kann es dauern.
fopen() selber bietet keine Möglichkeit, ein Zeitlimit anzugeben, da diese Funktion eine Dateisystemfunktion ist und dementsprechend eher nicht davon ausgegangen wird, daß es eine halbe Minute dauert, bis eine Datei gefunden ist. Solange braucht nichtmal eine gute, alte Diskette.
Damit kommst Du also nicht weiter, Du musst Dich schon etwas tiefer in's System begeben, zu den Netzwerk-Funktionen. Und da findest Du dann auch bei der Funktion fsockopen() die Möglichkeit, ein Zeitlimit anzugeben.
Der Nachteil ist allerdings, daß Du dich ein wenig mit dem HTTP-Protokoll (ganz wenig) beschäftigen musst. Das ist aber nicht allzu schwer:
Um rauszufinden, ob eine angegebene Datei existiert, schickst Du
HEAD http://tolle.doma.in/noch/bessere/seite.html HTTP/1.0\r\n\r\n
an den Server und der antwortet dann entweder mit
HTTP/1.1 200 OK
und einem Bandwurm an Informationen über die angefragte Datei oder mit dem berühmt-berüchtigten
HTTP/1.1 404 Not found
oder einem anderen Fehler.
Das Codebeispiel in der PHP-Anleitung unter fsockopen() ist nicht ganz richtig, so sollte es funktionieren und Dir den angesprochenen Bandwurm ausspucken:
<html><body><pre>
<?php
$fp = fsockopen("www.php.net", 80, $errno, $errstr, 30);
/*
Adresse www.php.net, Port 80 (http, dort wo der Webserver wartet), 30 Sekunden Limit
*/
if (!$fp)
{
echo "$errstr ($errno)<br>\n";
}
else
{
fputs($fp, "HEAD http://www.php.net/ HTTP/1.0\r\n\r\n");
while (!feof($fp))
{
echo htmlentities(fgets($fp,1024));
};
fclose($fp);
};
?>
</pre></body></html>
Man beachte, daß der einzige Unterschied zwischen Dateisystem- und Netzwerkfunktionen der Austausch von fopen() durch fsockopen() ist (und das Bearbeiten des Protokolls natürlich).
Ich habe in dem Beispiel außerdem das GET durch HEAD ersetzt. Mit GET sendet der Server Dir erst Informationen über die Datei und dann die komplette Datei selber, mit HEAD erhälst Du nur die Informationen (und mehr wolltest Du ja nicht).
Probier's einfach mal und ersetze HEAD wieder durch GET.
Gruß,
soenk.e