function httpGet( $url, $followRedirects=true ) {
    global $final_url;
    $url_parsed = parse_url($url);
    if ( empty($url_parsed['scheme']) ) {
        $url_parsed = parse_url('http://'.$url);
    }
    $final_url = $url_parsed;
    $port = $url_parsed["port"];
    if ( !$port ) {
        $port = 80;
    }
    $rtn['url']['port'] = $port;
    $path = $url_parsed["path"];
    if ( empty($path) ) {
        $path="/";
    }
    if ( !empty($url_parsed["query"]) ) {
        $path .= "?".$url_parsed["query"];
    }
    $rtn['url']['path'] = $path;
    $host = $url_parsed["host"];
    $foundBody = false;
    $out = "GET $path HTTP/1.0\r\n";
    $out .= "Host: $host\r\n";
    $out .= "User-Agent:      Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20061010 Firefox/2.0\r\n";
    $out .= "Connection: Close\r\n\r\n";
    if ( !$fp = @fsockopen($host, $port, $errno, $errstr, 30) ) {
        $rtn['errornumber'] = $errno;
        $rtn['errorstring'] = $errstr;
    }
    fwrite($fp, $out);
    while (!@feof($fp)) {
        $s 开发者_如何学编程= @fgets($fp, 128);
        if ( $s == "\r\n" ) {
            $foundBody = true;
            continue;
        }
        if ( $foundBody ) {
            $body .= $s;
        } else {
            if ( ($followRedirects) && (stristr($s, "location:") != false) ) {
                $redirect = preg_replace("/location:/i", "", $s);
                return httpGet( trim($redirect) );
            }
            $header .= $s;
        }
    }
    fclose($fp);
    return(trim($body));
}
This code sometimes go infinite loop. What's wrong here?
There is a big, red warning box in the feof() documentation:
Warning
If a connection opened by
fsockopen()wasn't closed by the server,feof()will hang. To workaround this, see below example:Example #1 Handling timeouts with feof()
<?php function safe_feof($fp, &start = NULL) { $start = microtime(true); return feof($fp); } /* Assuming $fp is previously opened by fsockopen() */ $start = NULL; $timeout = ini_get('default_socket_timeout'); while(!safe_feof($fp, $start) && (microtime(true) - $start) < $timeout) { /* Handle */ } ?>
Also you should only write to or read from the file pointer, if it is valid (what you are not doing, you just set an error message): This leads to the second big red warning box:
Warning
If the passed file pointer is not valid you may get an infinite loop, because
feof()fails to returnTRUE.
Better would be:
$result = '';
if ( !$fp = @fsockopen($host, $port, $errno, $errstr, 30) ) {
    $rtn['errornumber'] = $errno;
    $rtn['errorstring'] = $errstr;
}
else {
    fwrite($fp, $out);
    while (!@feof($fp)) {
        //...
    }
    fclose($fp);
    $result = trim(body);
}
return $result;
A last remark: If you follow a redirect with
 if ( ($followRedirects) && (stristr($s, "location:") != false) ) {
     $redirect = preg_replace("/location:/i", "", $s);
     return httpGet( trim($redirect) );
 }
you never close the file pointer. I think better is:
 if ( ($followRedirects) && (stristr($s, "location:") != false) ) {
     $redirect = preg_replace("/location:/i", "", $s);
     $result = httpGet( trim($redirect) );
     break;
 }
 // ...
 return $result;
feof will return false if the connection is still open in a tcp/ip stream.
function httpGet( $url, $followRedirects=true ) {
[...]
                return httpGet( trim($redirect) );
}
Nothing prevents you from fetching the same URL again and again.
 
         
                                         
                                         
                                         
                                        ![Interactive visualization of a graph in python [closed]](https://www.devze.com/res/2023/04-10/09/92d32fe8c0d22fb96bd6f6e8b7d1f457.gif) 
                                         
                                         
                                         
                                         加载中,请稍侯......
 加载中,请稍侯......
      
精彩评论