Roger: Erkennen ob Datei vorhanden

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.

  1. 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.

    1. 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.

      1. 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.

  2. 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.

  3. 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

    --
    DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN
    sh:( fo:| ch:? rl:( br:& va:| zu:) ss:| ls:[
    Die Erklärung zum Selfcode findest du hier: http://emmanuel.dammerer.at/selfcode.html
    Einen Decoder für den Selfcode findest du hier: http://peter.in-berlin.de/projekte/selfcode
    1. 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.

      1. 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

        --
        DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN
        sh:( fo:| ch:? rl:( br:& va:| zu:) ss:| ls:[
        Die Erklärung zum Selfcode findest du hier: http://emmanuel.dammerer.at/selfcode.html
        Einen Decoder für den Selfcode findest du hier: http://peter.in-berlin.de/projekte/selfcode
        1. 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.

          1. 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

            --
            DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN
            sh:( fo:| ch:? rl:( br:& va:| zu:) ss:| ls:[
            Die Erklärung zum Selfcode findest du hier: http://emmanuel.dammerer.at/selfcode.html
            Einen Decoder für den Selfcode findest du hier: http://peter.in-berlin.de/projekte/selfcode
            1. 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.

              1. 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

                --
                DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN
                sh:( fo:| ch:? rl:( br:& va:| zu:) ss:| ls:[
                Die Erklärung zum Selfcode findest du hier: http://emmanuel.dammerer.at/selfcode.html
                Einen Decoder für den Selfcode findest du hier: http://peter.in-berlin.de/projekte/selfcode
                1. 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.