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
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:
wäre euch sehr dankbar für vorschläge
gruß
croti
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_SOCKET, SO_RCVTIMEO, array("sec" => 2, "usec" => 0));
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($sock, 1024)) {
$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) < 5 && 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_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($this->_sck[$key], SOL_SOCKET, SO_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], $hd, strlen ($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;
}
}
?>
gruß
croti
Kommentar