Erkennen ob Datei vorhanden
Roger
- php
hallo leute!
ich möchte auf meiner seite externe grafiken einbinden. dumm ist, das manche grafiken zu gegebenen zeiten offline sind.
ich wollte das unterbinden, indem ich voher eine abfrage einbaute:
if ($handle = fopen ($gfx_url, "r"))
{
echo $gfx_url;
}
falls nun aber eine url offline sein sollte, so hängt sich das skript auf, bzw. dauert endlos lange, weil ja versucht wird die datei zu lesen...
kann ich das nicht unterbinden, indem ich sage "nach 2 sekunden brich ab"?
fsockopen bringt auch nicht so die punkte, da ich nicht die grafik, sondern nur die domain checken kann. :(
hat jemand eine idee?
gruß.
roger.
hey,
vielleicht hilft Dir ja folgende Fkt. weiter ...:
------------------
<?php
function phpLinkCheck($url, $r = FALSE)
{
$url = trim($url);
if (!preg_match("=://=", $url)) $url = "http://$url";
$url = parse_url($url);
if (strtolower($url["scheme"]) != "http") return FALSE;
if (!isset($url["port"])) $url["port"] = 80;
if (!isset($url["path"])) $url["path"] = "/";
$fp = fsockopen($url["host"], $url["port"], &$errno, &$errstr, 30);
if (!$fp) return FALSE;
else
{
$head = "";
$httpRequest = "HEAD ". $url["path"] ." HTTP/1.1\r\n"
."Host: ". $url["host"] ."\r\n"
."Connection: close\r\n\r\n";
fputs($fp, $httpRequest);
while(!feof($fp)) $head .= fgets($fp, 1024);
fclose($fp);
preg_match("=^(HTTP/\d+.\d+) (\d{3}) ([^\r\n]*)=", $head, $matches);
$http["Status-Line"] = $matches[0];
$http["HTTP-Version"] = $matches[1];
$http["Status-Code"] = $matches[2];
$http["Reason-Phrase"] = $matches[3];
if ($r) return $http["Status-Code"];
$rclass = array("Informational", "Success",
"Redirection", "Client Error",
"Server Error");
$http["Response-Class"] = $rclass[$http["Status-Code"][0] - 1];
preg_match_all("=^(.+): ([^\r\n]*)=m", $head, $matches, PREG_SET_ORDER);
foreach($matches as $line) $http[$line[1]] = $line[2];
if ($http["Status-Code"][0] == 3)
$http["Location-Status-Code"] = phpLinkCheck($http["Location"], TRUE);
return $http;
}
}
?>
-----------------
mfG,
Markus.
hey,
vielleicht hilft Dir ja folgende Fkt. weiter ...:
function phpLinkCheck($url, $r = FALSE)
was ist $r?
wenn ich die funktion aufrufe:
echo phpLinkCheck($gfx_url);
bekomme ich nur ne ausgabe eines arrays wieder :"Array". ich muss also das array korekt ansprechen... ???
gruß.
roger.
sorry, ich nehm alles zurück!
mein fehler. hätte mir vielleicht eine minute mehr zeit nehmen müssen.
die ausgabe funktioniert.
allerdings dauerts trotzdem noch ne ganze weile, eh was passiert...
:(
gruß.
roger.
hallo leute!
hat nicht noch jemand eine idee?
sowas wie ein ping zu machen wär doch nicht schlecht. dann bekommt man die antwortzeiten. aber ob das in php zu realiseren ist...
gruß.
roger.
Hi,
if ($handle = fopen ($gfx_url, "r"))
{
echo $gfx_url;
}
falls nun aber eine url offline sein sollte, so hängt sich das skript auf, bzw. dauert endlos lange, weil ja versucht wird die datei zu lesen...
das wundert mich, eigentlich sollte es relativ schnell arbeiten und auch normal abbrechen
kann ich das nicht unterbinden, indem ich sage "nach 2 sekunden brich ab"?
m.E. nein, vielleicht solltest Du mal readfile() ausprobieren, konnt es nicht checken, klang aber gut
fsockopen bringt auch nicht so die punkte, da ich nicht die grafik, sondern nur die domain checken kann. :(
doch Du kannst die Datei checken, indem Du z.B. einen Post-request abschickst o.ä.
ciao
romy
Hi,
m.E. nein, vielleicht solltest Du mal readfile() ausprobieren, konnt es nicht checken, klang aber gut
yo, allerdings gibt readfile die komplette seite seite aus, wenn zb. eine 404 seite angegeben wird...
ich habs jetzt mal mit file() ausprobiert. scheint zu gehen. allerdings kann ich es nicht unter realen bedingungen testen (hab keine seite die offline ist):
if (file($gfx_url)) echo "geht";
else echo "geht nicht";
wird hier ne 404 fehlerseite angegeben, dann bekomme ich allerdings auch ein "geht".
vielleicht gibt es noch eine elegantere methode?
gruß.
roger.
Hi,
vielleicht gibt es noch eine elegantere methode?
mir fällt nichts mehr ein, denke aber immernoch, dass fopen() funktionieren sollte.
ansonsten lies mal:
http://www.php.net/manual/de/features.remote-files.php
ciao
romy
Hi,
vielleicht gibt es noch eine elegantere methode?
mir fällt nichts mehr ein, denke aber immernoch, dass fopen() funktionieren sollte.
ansonsten lies mal:
http://www.php.net/manual/de/features.remote-files.php
hm. php.net ist eigentlich immer mein erster anlaufpunkt, bevor ich was poste ;)
sorry, die seite ist mir also nicht mehr neu.
aber trotzdem danke.
ich habe jetzt eine seite gefunden, die offline ist. allerdings funktioniert es weder mit fopen() noch mit file(). es dauert endlos lange, bis er aufgibt. shit. das ist nicht die endgültige lösung, die ich erwartet hab... :(
gruß.
roger.
Hi,
ich habe jetzt eine seite gefunden, die offline ist. allerdings funktioniert es weder mit fopen() noch mit file(). es dauert endlos lange, bis er aufgibt. shit. das ist nicht die endgültige lösung, die ich erwartet hab... :(
das ist sehr kurios:
dies hier:
if($fp = @fopen("http://<meinserver>/session/hallo.php",r)) echo "geht";
else echo "schlecht";
gibt bei mir innerhalb von einer Sekunde "schlecht" aus
vielleicht liegts an der Konfiguration?
ciao
romy
Hi,
if($fp = @fopen("http://<meinserver>/session/hallo.php",r)) echo "geht";
else echo "schlecht";gibt bei mir innerhalb von einer Sekunde "schlecht" aus
vielleicht liegts an der Konfiguration?
das ist genau deswegen, weil er die datei auf dem server nicht findet.
bei meinem problem gehts zum besipiel darum, das der server offline ist (meinetwegen ausgeschaltet) oder der dns eintrag ins leere zeigt.
wie zum beispiel hier: www.webmastermarkt.de (habs mit absicht nicht verlinkt). probier doch mal die url.
gruß.
roger.
Hi,
das ist genau deswegen, weil er die datei auf dem server nicht findet.
bei meinem problem gehts zum besipiel darum, das der server offline ist (meinetwegen ausgeschaltet) oder der dns eintrag ins leere zeigt.
wie zum beispiel hier: www.webmastermarkt.de (habs mit absicht nicht verlinkt). probier doch mal die url.
auch dies hier kommt binnen 1 Sekunde (auch wenn ich blahsdgfg.de eingebe, was es ja nicht geben kann ;))
if($fp = @fopen("www.webmastermarkt.de/hallo.php","r")) echo "gut";
else echo "schlecht";
Ansonsten könntest Du die tests ja verbinden, erst mit fsocketopen testen ob der server online ist, dann testen ob die Datei da ist!?
Ich glaube ich weiss noch nicht, was Du genau willst.
ciao
romy
Hi,
auch dies hier kommt binnen 1 Sekunde (auch wenn ich blahsdgfg.de eingebe, was es ja nicht geben kann ;))if($fp = @fopen("www.webmastermarkt.de/hallo.php","r")) echo "gut";
else echo "schlecht";
versteh ich nicht.
ich habs jetzt bei einem komplett anderen provider und bei mir zuhause (lokal) getestet mit dem selben ergebnis: es dauert endlos lange, bis eine fehlermeldung kommt. auch netscape konnte daran nichts ändern (also kein browserproblem).
*ratlos*
gruß.
roger.