Ankündigung

Einklappen
Keine Ankündigung bisher.

fsockopen() - Problemdomains

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • fsockopen() - Problemdomains

    Hallo an alle,

    denkt bitte nicht: "Schon wieder eine fsockopen-, http_Request-Frage."
    Ich habe ein Problem, das in keinem der Posts, die ich zu diesem Thema hier gefunden habe, thematisiert, bzw. angesprochen wurde:

    Mein Ziel: Ich möchte ein Script schreiben, dass Domains aus einer Datenbank liest und den Stutus (zB. 200, 302, 404 etc.) zurückgibt.
    Ich bin, dank diesem Forum, auf fsockopen(), http_request von pear und curl gestoßen.
    curl scheidet leider aus, da es nicht zur Verfügung steht.
    Ich habe mich für fsockopen und/oder http_request entschieden.
    fsockopen gibt zwar keinen Fehlercode (200, 404 etc.) zurück, aber immerhin kann ich damit herausfinden, ob eine domain erreichbar ist.

    Nun endlich zum eigentlichen Problem: Die Scripte, die ich mit fsockopen und http_request geschrieben habe funtionieren soweit ganz gut, nur bei Domains folgenden Typs nicht:
    - http://www.ein-beispiel.de // Domain mit "-"
    - http://www.beispiel.de.tp // "erweiterte" Topleveldomain
    - bei Domains mit Umlauten
    Okay bei Domains mit Umlauten kann ich es vielleicht akzeptieren, dass es hier keine Lösung/Möglichkeit gibt, da ein sehr spezielles Problem von Deutschland und kein globales.

    In den ersten beiden Fällen bin ich der Meinung, dass es funktioneren sollte. Ich habe testweise verschiedene der Problemdomains getestet und das Ergebniss war immer das selbe. Natürlich habe ich die Domains auch manuell (sprich im Browser) überprüft, hätte ja sein können, dass sie wirklich nicht erreichbar sind, jedoch war das nicht der Fall.
    Jetzt habe ich mir überlegt, dass vielleicht Proxyserver oder Firewalls Einfluß nehmen könnten. Habe die Scripte zu Hause mal getestet, dort war das Ergebniss jedoch das selbe.

    Hier ist mal der Code der Funktionen, die ich geschrieben habe.

    Mit fsockopen():
    PHP-Code:
    function check_domain($domain)
    {
        
    $check = @fsockopen($domain80, &$errno, &$errstr15);
        if(!
    $check
        {
            
    /* Aktualisierung in der DB */
            /* Benachrichtigung der Admins */
            
    return;
        }
        else 
        {
            
    /* Aktualisierung in der DB */
            
    return;            
        }

    Bei den Problemdomains kann kein socket geöffnet werden, der else-Fall tritt nicht ein.

    Mit pear - http_Request:
    PHP-Code:
    function check_domain($domain)
    {
       require_once (
    'includes/pear/HTTP/Request.php'); 
       
    $check =& new HTTP_Request("");
          
       
    $domain .= "/";
       
    $check->setURL($domain);
       
    $check->sendRequest();      
       
    $code $check->getResponseCode();
       echo 
    "Code: ".$code;

    In diesem Fall lasse ich mir nur den http-Status ausgeben, alles weitere ist dann ja kein Problem mehr.
    Eine weitere Methode den Statuscode zu bekommen ist auch:

    Mit pear - HTTP_Client::Head()
    PHP-Code:
    function check_domain($url)
    {
          require_once (
    'includes/pear/HTTP/Client.php');
          
    $check = new HTTP_Client("");
          
    $code $check->head($url);
          echo 
    "Code: ".$code;

    Das Ergebnis bei Problemdomains ist:
    Code:
    Code: Object id #7
    Habt ihr vielleicht Ideen, woran es liegen könnte, oder hattet ihr das Problem auch schon und kennt eine Lösung?
    Danke für eure Antworten.

  • #2
    Hi.

    Habe mal mit phpLinkCheck() rumgespielt. Könnte auch was für dich sein ...?

    Kommentar


    • #3
      Danke für die Antwort.

      Habe dein Script mit ein paar Problemdomains getestet, es gab leider das selbe Ergebnis wie bei meinen Scripts.
      Es scheint, als könnte keine Socketverbindung bei einer Problemdomain geöffnet werden. Somit wird false zurückgeliefert bzw. der Timeout schlägt zu. Ich habe den Timeout mal hochgesetzt, aber das ändert auch nichts.

      Kommentar


      • #4
        Ich nochma ...

        Habe das von mir verlinkte Skript auch mal (lokal) mit "Problemdomains" getestet. Einige liefen problemlos durch, andere wiederum nicht ...?!

        Könntest du "deine" getesteten Domains mal posten ...?

        Kommentar


        • #5
          Hier meine Testseiten:
          - http://www.karate-seeheim.de
          - http://www.boese-online.de
          - http://www.bbc.co.uk
          - http://www.börse-online.de/

          Das Ergebnis bei allen Testdomains ist:
          Code:
          fsockopen() [function.fsockopen]: unable to connect to www.boerse-online.de:80 (A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.)
          Ich habe auch den Timeout mal auf 60 gesetzt. Das ändert jedoch nichts.

          Gerade ist mir auch aufgefallen, dass das Script bei "normalen" Websites, wie zB. http://www.google.de nicht funktioniert.
          Kann es sein, dass der Socketzugriff von den entsprechenden Domains aus Sicherheitsgründen geblockt wird?

          Kommentar


          • #6
            Hi,

            Mir scheint das eher ein Namensauflösungsproblem zu sein...vielleicht tut sich der Resolver auf deinem Server mit speziellen Zeichen ein bisschen schwer.
            Um das ausschliessen zu können kannst du dir ja mal per nslookup die IP's zu dein Domains holen und dann mit der IP testen.

            Zitat von dragon1402
            Kann es sein, dass der Socketzugriff von den entsprechenden Domains aus Sicherheitsgründen geblockt wird?
            Meiner Ansicht nach ist ein fsockopen auf Port 80 nichts anderes als ein HTTP-Zugriff. Also sollte da nix geblockt werden.

            mfg Louis

            Kommentar


            • #7
              Zitat von luis
              Meiner Ansicht nach ist ein fsockopen auf Port 80 nichts anderes als ein HTTP-Zugriff. Also sollte da nix geblockt werden.
              Irgendwie einleuchtend :wink:
              Ich habe deine Idee mal ausprobiert, sowohl mit nslookup, als auch mit diesem kleinen Script:
              PHP-Code:
              <?php
                  error_reporting
              (E_ALL);
                  
              $domain "www.boerse-online.de";
                  
              $ip gethostbyname($domain);
                  echo 
              $domain" -> " .$ip;
                  
              $check_ip "http://".$ip;
                  require_once (
              '../includes/pear/HTTP/Client.php');
                  
              $check = new HTTP_Client("");
                  
              $code $check->head($check_ip);
                  echo 
              "
              Code: "
              .$code;
              ?>
              Ergebnis bei www.boerse-online.de:
              Code:
              www.boerse-online.de -> 194.12.210.209
              Code: Object id #6
              So wie ich das nur sehe, spreche ich mit der IP-Adresse einen ganz bestimmten Webserver an und nicht eine bestimmte Website, die auf dem Webserver gehostet ist.

              Eine andere Idee, zu der ich gerne mal eure Meinung hören würde, ist:
              Wenn ein fsockopen() auf Port 80 einem ganz normalen HTTP-Zugriff entspricht - was ja auch sehr einleuchtend ist - dann könnte es doch sein, dass bei meinem Problem ein Proxyserver seine Finger mit im Spiel hat.
              Immerhin fungiert ein HTTP-Proxy als Zwischenspeicher und unternaderem noch als Trennung zwischen lokalem Netz und Internet.
              Was außerdem für diese These spricht, ist, dass auch www.google.de entsprechend das oben stehende Ergebnis ausgibt, die firmeninternen Webserver jedoch positiv auf den Request antworten.
              Was denkt ihr?

              Kommentar


              • #8
                Zitat von dragon1402
                So wie ich das nur sehe, spreche ich mit der IP-Adresse einen ganz bestimmten Webserver an und nicht eine bestimmte Website, die auf dem Webserver gehostet ist.
                Auf einem Webserver können mehre Websites unter der gleichen IP gehostet werden. Dieses Vorgehen nennt sich "namensbasierte virtuelle Hosts". Der Webserver wertet dabei den Host-Header in der Anfrage des Clients aus und liefert dann Daten aus dem entsprechenden virtuellen Host.

                Kommentar


                • #9
                  Vielleicht hätte ich erwähnen sollen, dass ich XAMPP verwende und meine Scripte local entwickle. Ich habe die Scripte jetzt mal auf einem anderen Webserver getestet (nicht XAMPP) und da funktioniert es top.

                  Um mit voller Funktion weiterhin local zu entwickeln, wäre es toll, wenn es auch von meinem lokalen Apache funktionieren würde.
                  Seht ihr da eine Möglichkeit, muss ich vielleicht meinen Apache anders kunfigurieren?

                  Kommentar


                  • #10
                    Zitat von dragon1402
                    Vielleicht hätte ich erwähnen sollen, dass ich XAMPP verwende und meine Scripte local entwickle. Ich habe die Scripte jetzt mal auf einem anderen Webserver getestet (nicht XAMPP) und da funktioniert es top.
                    Ja das hättest du erwähnen können.

                    Zitat von dragon1402
                    Um mit voller Funktion weiterhin local zu entwickeln, wäre es toll, wenn es auch von meinem lokalen Apache funktionieren würde.
                    Seht ihr da eine Möglichkeit, muss ich vielleicht meinen Apache anders kunfigurieren?
                    Was heisst "lokal"? Ist da ein Router dazwischen oder wie? Ist der Server von aussen erreichbar? Beschreib mal deine "lokale" Netzwerktopologie!

                    Kommentar

                    Lädt...
                    X