multi-socket und timeout

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

  • multi-socket und timeout

    Hallo,

    ich versuche gerade ein script zu schreiben welches mehrere sockets gleichzeitig öffnet, um gleichzeitig mehre webseiten öffnet. das alles klappt auch gut, aber ich habe probleme beim timeout, genauer mit

    PHP-Code:
    socket_set_option($this->_sck[$key], SOL_SOCKETSO_RCVTIMEO, array("sec" => 2"usec" => 0)); 
    wenn eine seite länger zum aufbau braucht, als im timeout angegeben, versucht der socket trotzdem weiter zu lesen und bricht den socket_read nicht ab.
    hat jemand eine idee?

    Hier einmal mein code:
    PHP-Code:
    <?php
    class MultiSock {
        
        
        var 
    $_sck = array();        // sockets
        
    var $_engines = array();    // engines array


        
    function init($aEngines) {
            echo 
    "<hr><h1>entering</h1><hr>";flush();
            
    $this->_engines $aEngines;
            
    $i 0;
            foreach(
    $this->_engines as $key => $url) {
                
    $this->addEngine($key,$url);
                
    $i++;
                if(
    $i >= 4)
                    break;
            }
            echo 
    "<hr><h1>Engines Added</h1><hr>";flush();
            
    $break false;

            while(!
    $break) {
                
    $new_socks $this->_sck;
                
    $num_changed_sockets socket_select($new_socks$write NULL$except NULL,0);

                foreach(
    $new_socks as $sock) {
                    echo 
    "<h1>$sock</h1>";
                    
    $index array_search($sock$this->_sck);
                    echo 
    "<hr>" $index ."<hr>";
                    
    $read "";
                    
                    while(
    $buf socket_read($sock1024)) {
                        
    $read .= trim($buf);
                        
                    }
                    
    socket_close($sock);
                    
    $h explode("\r\n\r\n",$read,3);
                    
    $aHeader $this->http_parse_headers($h[0]);
                    
    $body = @$h[1];
                    
                    echo 
    "<pre>";print_r($aHeader);echo "</pre>";
                    
    flush();
                }
                
    $this->_sck array_diff($this->_sck$new_socks);

                if(
    count($this->_sck) < && count($this->_engines) >= 1) {
                    foreach(
    $this->_engines as $key => $url) {
                        
                        
    $this->addEngine($key,$url);
                        break;
                    }
                }
                if(
    count($this->_sck) < 1) {
                    break;
                }
            }
        }
        
        function 
    addEngine($key,$aEngine) {

            
            unset(
    $this->_engines[$key]);
            
            
    $this->_sck[$key] = socket_create (AF_INETSOCK_STREAMSOL_TCP);
            
    socket_set_option($this->_sck[$key], SOL_SOCKETSO_RCVTIMEO, array("sec" => 2"usec" => 0));
            
            
    $uriPt parse_url($aEngine['url']);
            echo 
    "<b style=color:red;>Engine: ".$aEngine['url']."</b><br>";flush();

            if(
    false == @socket_connect($this->_sck[$key], $uriPt['host'], 80)) {
                echo 
    $this->_errors[$key] = socket_strerror(socket_last_error());
                unset(
    $this->_sck[$key]);

                return 
    false;
            } else {
                
    $hd $this->genHeader($aEngine);
                
    socket_write ($this->_sck[$key], $hdstrlen ($hd));
            }
        }
        
        
        
        function 
    genHeader ($aEngine) {
            
    $uriPt parse_url($aEngine['url']);
            
    $address $uriPt['host'];
            
    $uri $uriPt['path'] . '?' $uriPt['query'];
            
    $uri $uri $uri '/';
            
    $in "GET $uri HTTP/1.1\r\n";
            
    $in .= "Host: $address\r\n";
            
    $in .= "Content-Type: application/x-www-form-urlencoded\r\n";
            
    $in .= "Content-Length: ".strlen($uriPt['query'])."\r\n";
            
    $in .= "Connection: Close\r\n\r\n";
            
    $in .= $uriPt['query'] ."\n";
            return 
    $in;
        }
        
        
    /**
         * parses the http header int oan array
         * 
         * @param str $headers
         */
        
    function http_parse_headers($headers){
               
    $headers str_replace("\r","",trim($headers));
               
    $headers explode("\n",$headers);
            foreach(
    $headers as $value){
                
    $header explode(": ",$value);
                if(
    $header[0] && empty($header[1])){
                    
    $headerdata['status'] = $header[0];
                    if(
    preg_match("|^HTTP/[^\s]*\s(.*?)\s|",$header[0], $status))
                        
    $headerdata['statuscode'] = $status[1];
                } elseif(
    $header[0] && $header[1]){
                    
    $headerdata[$header[0]] = $header[1];
                }
            }
            return 
    $headerdata;
        }

    }
    ?>
    wäre euch sehr dankbar für vorschläge

    gruß
    croti

  • #2
    solltest Du in socket_set_option nicht den level tcp benutzen?
    Beantworte nie Threads mit mehr als 15 followups...
    Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

    Kommentar


    • #3
      hallo,

      danke für das drübergucken, aber das klappt leider nicht ....

      wenn ich

      PHP-Code:
      socket_set_option($this->_sck[$key], SOL_TCPSO_RCVTIMEO, array("sec" => 5"usec" => 0)); 
      oder auch
      PHP-Code:
      socket_set_option($this->_sck[$key], getprotobyname('tcp'), SO_RCVTIMEO, array("sec" => 5"usec" => 0)); 
      ... (gibt ja beides den wert 6 zurück) ...

      setze dann bekomme ich folgende fehlermeldung:
      Warning: socket_set_option() [function.socket-set-option]: unable to set socket option [92]: Protocol not available
      Mit einem einzelnem socket, ohne socket_select klappt das timeout auch, nur eben nicht mit mehreren

      Kommentar

      Lädt...
      X