fsockopen + Serverantwort auswerten

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

  • #16
    ... weil dann dein Browser einen korrekten Request sendet.
    Und der ist genau gleich, wie der Request den ich an die Seite sende. Die Header Daten habe ich mit LiveHeader geprüft und die sind identisch. Das Ändern von Hostname auf Host hat bei den betreffenden Links nix gebracht.

    Gruss

    tobi
    Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

    [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
    Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

    Kommentar


    • #17
      Original geschrieben von jahlives
      Und der ist genau gleich, wie der Request den ich an die Seite sende.
      Das glaube ich irgendwie nicht. Wäre zwar möglich, wenn zum Beispiel der UA noch eine Rolle spielen würde. Dem ist aber nicht so, siehe
      PHP-Code:
      $url 'http://www.swissinfo.org/sde/swissinfo.html?siteSect=1111';
      $data parse_url($url);

      $in[] = "GET ".$url." HTTP/1.0\r\n";
      $in[] = "GET ".$data['path']."?".$data['query']." HTTP/1.1\r\nHost: ".$data['host']."\r\n";
      $in[] = "GET ".$data['path']."?".$data['query']." HTTP/1.X\r\nHostname: ".$data['host']."\r\n";

      foreach (
      $in as $i) {
          
      $temp '';
          
      $fp fsockopen($data['host'], 80);
          
      fputs($fp$i."Connection: close\r\n\r\n");
          while(!
      feof($fp)) $temp .= fgets($fp4096);
          echo (
      strpos($temp'200 OK') ? '200' '!200').'<br>';
          
      fclose($fp);

      Ausgabe: 200, 200, !200

      Kommentar


      • #18
        @onemorenerd
        Deine Requests sind schon korrekt. Ich bin da wohl selber etwas
        blind gewesen Ich hatte da ein Mischmasch aus vollständigem URL
        kombiniert mit Hostname --> vollständigen Bullsh.. also...
        Ich hatte jedoch auch einige Seiten, die einen 301-er und 302-er
        warfen und darauf habe ich ned geprüft.
        Habe den Code jetzt mal so angepasst, dass er bei 301-er und
        302-er die neue Location aus dem Header ausliest und
        anschliessend diese prüft. Falls sie korrekt ist wird die Adresse
        dieses Feeds in der DB angepasst, damit bei der nächsten Prüfung
        direkt die korrekte Adresse abgefragt wird.
        Falls jemand Interesse hat poste ich hier mal noch den Code von check_feed()
        PHP-Code:
        $mysql_user 'administrator';            //Benutzer für die DB
        $mysql_server '127.0.0.1';    //IP des Mysql Servers
        $mysql_pswd 'ichbintotalgeheim';        //User Passwort
        $mysql_db 'news';                //Name der DB
        $mysql_table 'news_arr';        //Tabellenname
        $url 'http';                    //Feldname des URL in der DB
        $rep = array('http://');        // welche Teile sollen aus der URL entfernt werden

        function check_feed(){
            
        $db mysql_connect($mysql_server,$mysql_user,$mysql_pswd);
            
        mysql_select_db($mysql_db,$db);
            
        $sql "SELECT $url FROM $mysql_table where online='0'";
            
        $res mysql_query($sql,$db);
            while(
        $erg mysql_fetch_assoc($res)){
                
        $data str_replace($rep,'',$erg["$url"]);
                
        $data parse_url('http://'.$data);
                
        //Socketverbindung zum angegebenen Host aufbauen
                
        $fp fsockopen($data['host'],80,$errno,$errstr);
                if(
        $fp === false){
                    
        //Verbindungsaufbau gescheitert --> URL inaktiv
                    
        $sql "Update $mysql_table set online='0' where $url='$erg[$url]'";
                    
        mysql_query($sql);
                    continue;
                }
                
        //Header für Request zusammensetzen
                
        $in "GET ".$data['path']."?".$data['query']." HTTP/1.1\r\nHost: ".$data['host']."\r\n";
                
        $in .= "Connection: close\r\n\r\n";
                
        fputs($fp,$in);
                
        $header '';
                
        //Serverantwort abholen bis zum Connection: close
                
        for($i=0;$i<100;$i++){
                    
        $header .= fgets($fp,512);
                    if(
        stripos($header,'connection: close')){
                        break;
                    }
                }
                
        //Serverantwort auf Redirects prüfen und diese ggf verfolgen
                
        if(preg_match('/HTTP\\/1\\..{1}\\s{1,}301/i',$header) != false || 
        preg_match('/HTTP\\/1\\..{1}\\s{1,}302/i',$header) != false){
                    
        //Location auslesen und neue URL zerlegen
                    
        preg_match('/Location: http:\\/\\/.{1,}/i',$header,$new_url);
                    
        $new_url preg_replace('/Location:\\s{1,}/i','',$new_url[0]);
                    
        $new_url trim($new_url);
                    
        $data parse_url($new_url);
                    
        //Header für neuen Request
                    
        $in "GET ".$data['path']."?".$data['query']." HTTP/1.1\r\nHost: ".$data['host']."\r\n";
                    
        $in .= "Connection: close\r\n\r\n";
                    
        //alte Socketverbindung schliessen
                    
        fclose($fp);
                    
        //Socketverbindung auf neuen Host öffnen
                    
        $fp fsockopen($data['host'],80,$errno,$errstr);
                    if(
        $fp === false){
                        
        $sql "Update $mysql_table set online='0' where $url='$erg[$url]'";
                        
        mysql_query($sql);
                        continue;
                    }
                    
        fputs($fp,$in);
                    
        $header '';
                    for(
        $i=0;$i<100;$i++){
                        
        $header .= fgets($fp,512);
                        if(
        stripos($header,'connection: close')){
                            break;
                        }
                    }
                    
        //Header auf Status 200 prüfen und URL aktiv setzen
                    
        if(preg_match('/HTTP\\/1\\..{1}\\s{1,}200/i',$header) != false){
                        
        $sql "Update $mysql_table set online='1',$url='$new_url' where $url='$erg[$url]'";
                        
        mysql_query($sql);
                    }else{
                        
        //Status 200 nicht gefunden URL inaktiv setzen
                        
        $sql "Update $mysql_table set online='0' where $url='$erg[$url]'";
                        
        mysql_query($sql);
                        
        /*
                        Abfrage -und Response Header zur Fehlerbehandlung dumpen
                        var_dump(strip_tags($header,'<br>,<br />,<a>'));
                        echo '<br />';
                        var_dump($in);
                        echo '<br /><br />';
                        */
                    
        }
                }elseif(
        preg_match('/HTTP\\/1\\..{1}\\s{1,}200/i',$header) != false){
                    
        //Header auf Status 200 prüfen und URL aktiv setzen
                    
        $sql "Update $mysql_table set online='1' where $url='$erg[$url]'";
                    
        mysql_query($sql);
                }else{
                    
        //Status 200 nicht gefunden URL inaktiv setzen
                    
        $sql "Update $mysql_table set online='0' where $url='$erg[$url]'";
                    
        mysql_query($sql);
                    
        /*
                    Abfrage -und Response Header zur Fehlerbehandlung dumpen
                    var_dump(strip_tags($header,'<br>,<br />,<a>'));
                    echo '<br />';
                    var_dump($in);
                    echo '<br /><br />';
                    */
                

                
        fclose($fp);    
            }

        Falls jemand noch Verbesserungsvorschläge sieht, immer her damit

        Danke für die Hilfe und Gruss

        tobi
        Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

        [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
        Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

        Kommentar


        • #19
          Hm, vielleicht irre ich mich auch, aber mir scheint es doch ziemlich sinnfrei, mit SELECT ... WHERE online=0 die URLs aus der DB zu holen und wenn dann ein Verbindungsaufbau nicht klappt, ein UPDATE ... SET online=0 zu machen. Da wird doch nichts geändert, wenn online vorher schon 0 war. Nur Resourcenverschwendung oder?

          Kommentar


          • #20
            Nur Resourcenverschwendung oder?
            Habe ich gar noch nicht bedacht. Wird noch geändert, danke.

            Gruss

            tobi
            Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

            [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
            Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

            Kommentar

            Lädt...
            X