[Funktion] 404 Fehler bei TCP Socket Connection

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

  • [Funktion] 404 Fehler bei TCP Socket Connection

    Hallo miteinander,

    ich möchte gerne ein Script erstellen welches RSS Dateien lokal zwischenspeichert, damit diese später weiterbearbeitet werden. Mittlerweile hab ich das Script so fertig. Leider ereignet sich ein merkwürdiger Fehler.

    Auszug aus dem Code:

    PHP-Code:
    $urlParts parse_url($url); 
    PHP-Code:
    $flag fsockopen($host$port$errno$errstr$fsocket_timeout); 
    Anschließend werden die Daten in einer Datei gespeichert. Dies funktioniert mit url wie http://msdn.microsoft.com/visualc/rss.xml oder http://www.heise.de/tp/news-xl.rdf usw. bestens. Beim Versuch das RDF file http://www.heise.de/newsticker/heise.rdf zu speichern wird statt der angegebenen Datei aber die heise.de 404 Fehlerseite zwischengespeichert. Folgender Header ist zu sehen.

    HTTP/1.1 404 Error
    Date: Sat, 05 Feb 2005 18:12:46 GMT
    Server: Apache/1.3.29
    Vary: Accept-Encoding,User-agent
    Connection: close
    Content-Type: text/html; charset=iso-8859-1

    Nun habe ich schon dutzende debug meldungen im script eingebaut, finde den Grund dafür aber nicht. Würd mich freuen wenn mir hier jemand weiterhelfen könnte.

    MfG

  • #2
    bei mir kommt eigentlich direkt ein '200 ok'...
    da die zwei codeauszüge recht aussagelos sind, kann ich nur empfehlen, alle variablen, die an fsockopen() gehen, vorher nochmal auszugeben.

    Kommentar


    • #3
      Hallo penizillin,

      ich kann es leider auch nicht begreifen. Die übergebenen Variablen habe ich bereits im debug modus durchgesehen. Folgende Auszüge daraus

      Local Cache Creation Time: 1107635153
      Actual Time: 1107635276
      Timeout = 2
      File Physical Path: xxx\index.php
      File Web Path: http://xxx/index.php
      Caching file: (http://www.heise.de/newsticker/heise.rdf)
      To local: (xxx.rdf.cached)
      Host: www.heise.de
      Port: 80
      http://www.heise.de/newsticker/heise.rdf
      /newsticker/heise.rdf


      Local Cache Creation Time: 1107631913
      Actual Time: 1107635357
      Timeout = 2
      File Physical Path: xxx\index.php
      File Web Path: http://xxx/index.php
      Caching file: (http://www.heise.de/tp/news-xl.rdf)
      To local: (xxxnews-xl.rdf.cached)
      Host: www.heise.de
      Port: 80
      http://www.heise.de/tp/news-xl.rdf
      /tp/news-xl.rdf

      Die Speicherung bei Aufruf der url "http://www.heise.de/tp/news-xl.rdf" mit
      derselben funktion funktioniert ohne probleme. Bei Aufruf der obigen url "http://www.heise.de/newsticker/heise.rdf" wird nur die besagte heise 404 Seite abgespeichert obwohl diese erreichbar ist

      Das macht irgendwie keinen Sinn

      Wegen dem Code:


      PHP-Code:
                  $data null;
                  
      stream_set_timeout($fp$fsocket_timeout);
                  
      $status socket_get_status($fp);

                  while( !
      feof($fp) && !$status['timed_out'] )
                  {
                      
      $data .= fgets ($fp,8192);
                      
      $status socket_get_status($fp);
                  }
                  
      fclose ($fp);

                  
      // save data to cache file
                  
      $f2 fopen($cache_filename,"w+");
                  
      fwrite($f2,$data);
                  
      fclose($f2); 
      MfG
      Zuletzt geändert von StarShaper; 05.02.2005, 20:58.

      Kommentar


      • #4
        nun, da ich trotzdem nicht an wunder glaube, frage ich mich, ob der restliche programmablauf für beide adressen gleich ist. da ich die anwendung nicht kenne, würde ich vorschlagen, sie auf das nötigste zu reduzieren und dann schrittweise zu debuggen.

        (zwar ne unwahrscheinliche fehlerquelle, aber nichtsdestotrotz - versuch mal den ganzen pfad manuell einzutippen. evtl. sind beim kopieren irgendwelche sonderzeichen reingekommen)

        wie sieht der ausgehende request letztendlich aus?
        Zuletzt geändert von penizillin; 05.02.2005, 20:57.

        Kommentar


        • #5
          Der Programmablauf ist für beide identisch, da ich nun mittlerweile den Code vom gesamten Programm extrahiert habe um die fehlerquelle zu finden. Der Fehler liegt sicher irgendwo, aber leider finde ich ihn einfach nicht

          Eigenartig ist aber das es ich um ein und densselben Code handelt der bei einigen URLS funktioniert und bei anderen wieder nicht. Der Link zu den heise feeds http://www.heise.de/tp/news-xl.rdf läuft ebenfalls der zu http://www.heise.de/tr/aktuell/news.rdf wiederrum nicht.


          PHP-Code:
          fputs$fp"GET $url HTTP/1.0\r\nHost:$host\r\n\r\n" 
          MfG
          Zuletzt geändert von StarShaper; 05.02.2005, 21:09.

          Kommentar


          • #6
            Ok, der Tipp mit dem ausgehenden request war sehr hilfreich. Hab den Fehler nun. Vielen Dank für das Brainstorming !

            MfG

            Kommentar


            • #7
              dann sag doch bitte auch noch, woran's lag.
              I don't believe in rebirth. Actually, I never did in my whole lives.

              Kommentar


              • #8
                Upps, natürlich. Die GET-Methode ruft die Daten ab.
                Hierfür wird zuerst die URL zersplittet.

                PHP-Code:
                $urlParts parse_url($url);
                        
                $host $urlParts['host'];
                $path $urlParts["path"]; usw

                Anschließend wird der host angesprochen und via HTTP eine GET-Nachricht gesendet. Mit der Anfrage nach der relativen Datei. Beispiel:

                http://www.heise.de/tr/aktuell/news.rdf

                host = www.heise.de
                path = /tr/aktuell/news.rdf

                Nun hatte ich den Fehler gemacht die url zu senden und nicht den Pfad. Dies ist nicht ganz richtig und kann zu Fehlern führen. Richtig ist folgende Syntax:

                [/PHP]
                PHP-Code:
                GET $path HTTP/1.0\r\nHost$host\r\n\r\
                Dank penizillin bin ich darauf gekommen. Ich hoffe ich habs einigermaßen gut beschrieben und es hilft einem user vielleicht mal weiter.

                MfG

                Kommentar


                • #9
                  OffTopic:
                  vorbildliche lösungsbeschreibung
                  vorschlag: file()

                  Kommentar


                  • #10
                    PHP-Code:
                     vorschlagfile() 
                    Vorschlag ist nicht schlecht. Doch wie bereits in einem der Comments dort zu lesen ist:

                    Beware of using file() to call a URL from a remote server on a live Web site, as there is no way to set a maximum connection time.
                    Bei timeouts etc. würde bei dynamisch erzeugten Webseiten ein Fehler verursacht werden und die Seite evtl. sogar abstürzen. Deshalb fsocket() mit true false Prüfung.

                    cu

                    Kommentar

                    Lädt...
                    X