fsockopen找开一个网址后,然后用fputs发送信息,再获得内容,
我想问一下,是不是每次都要执行这个过程?
有没有可能像telnet那样,打开一个网址链接后,如:http://www.123.com,再访问该网址下的其它内容不需要再用fsockopen重新建立链接。
我的想法主要是每次fsockopen重新打开一个页面效率是不是一样,哪怕是同一域名下的网址,那样的话,如果不考虑head的设置,那是不是就和 file_get_contents 一样了,没有其它的用处

解决方案 »

  1.   

    你不调用fclose就不需要重新打开fsockopen,你可以在程序的最后调用fclose关闭连接。
    $fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
    if (!$fp) {
        echo "$errstr ($errno)<br />\n";
    } else {
        $out = "GET / HTTP/1.1\r\n";
        $out .= "Host: www.example.com\r\n";
        $out .= "Connection: Close\r\n\r\n";
        fwrite($fp, $out);
        while (!feof($fp)) {
            echo fgets($fp, 128);
        }
        fclose($fp); //这里才是关闭连接,如果你不关闭就需要再打开。
    }
    ?>
      

  2.   

    在一个程序中,你可以反复的 fputs、fgets,只要你知道是在做什么
      

  3.   

    请问楼上的,
    $fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
    if (!$fp) {
        echo "$errstr ($errno)<br />\n";
    } else {
        $out = "GET / HTTP/1.1\r\n";
        $out .= "Host: www.example.com/1.htm\r\n";
        $out .= "Connection: Close\r\n\r\n";
        fwrite($fp, $out);
        while (!feof($fp)) {
            echo fgets($fp, 128);
        }    $out = "GET / HTTP/1.1\r\n";
        $out .= "Host: www.example.com/2.htm\r\n";
        $out .= "Connection: Close\r\n\r\n";
        fwrite($fp, $out);
        while (!feof($fp)) {
            echo fgets($fp, 128);
        }
        fclose($fp); //这里才是关闭连接,如果你不关闭就需要再打开。
    }
    这样可以吗?
      

  4.   

    $fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
    if (!$fp) {
        echo "$errstr ($errno)<br />\n";
    } else {
        $out = "GET / HTTP/1.1\r\n";
        $out .= "Host: www.example.com/1.htm\r\n";
        $out .= "Connection: Keep-alive\r\n\r\n"; //这里要修改,而且服务器那边可能有超时时间限制
        fwrite($fp, $out);
        while (!feof($fp)) {
            echo fgets($fp, 128);
        }    $out = "GET / HTTP/1.1\r\n";
        $out .= "Host: www.example.com/2.htm\r\n";
        $out .= "Connection: Close\r\n\r\n";
        fwrite($fp, $out);
        while (!feof($fp)) {
            echo fgets($fp, 128);
        }
        fclose($fp); //这里才是关闭连接,如果你不关闭就需要再打开。
    }
      

  5.   

    $url = "http://192.168.1.108:8080/curl.php?c=b";
    $info = parse_url( $url );
    $fp = fsockopen($info["host"], 8080, $errno, $errstr, 30);
    if( !$fp ){
    }else{
    $out .= "GET ".$info['path']."?c=a\r\n HTTP/1.0 \r\n";//设置get 参数C=A
        $out .= "Host: ".$info["host"]."\r\n";
        $out .= "Connection: Keep-alive\r\n\r\n"; 
        fwrite($fp, $out);
        while (!feof($fp)) {
            echo fgets($fp, 128);
        }
    echo "<hr>";
    $out .= "GET ".$info['path']."?c=c\r\n HTTP/1.0 \r\n";//设置get 参数C=c
        $out .= "Host: ".$info["host"]."\r\n";
        $out .= "Connection: Keep-alive\r\n\r\n";
        fwrite($fp, $out);
        while (!feof($fp)) {
            echo fgets($fp, 128);
        }
        fclose($fp); //这里才是关闭连接,如果你不关闭就需要再打开。
    }
    输出结果,只能是输出第一次的,也就是说第二次啥输出结果也没有,是空白的,这是为什么呢?
    a<hr>
      

  6.   

    再次承认错误,还是想当然了。
    折腾了很久,发现想一次fsocketopen,然后永久使用这个handle是不可能。
    因为$fp的指针在第一次读完返回的内容后,它就在末尾了,想用fseek或者rewind复位,php手册上说针对http类型的指针不能使用这两个函数复位,这就导致了第二个while($feop($fp))循环根本进不去。
    不要试图取消这个while语句,因为指针已经在$fp的末尾了,试图直接fgets($fp, 128)也是徒劳无功的。没有试过如果只是执行第二次fwrite,不做fgets是不是可以,因为没有想到验证的方法。结论是:想要再次发送http请求,你的再次使用fsocketopen打开新连接。如果想操作这些麻烦的话,使用cURL吧。
      

  7.   

    非常谢谢CunningBoy如果用curl的话,可以实现这种效果吗?
    打开http://www.xx.com后,不中断,继续访问他下边的页面,还是说,也是每次也都是一个完整的URL访问
      

  8.   

    curl_exec($ch);
    可以在一次curl_init之后,curl_close($ch);之前反复使用
      

  9.   

    CunningBoy大哥
    我查了一下curl,
    $ch = curl_init("http://www.a.com");
    $tx = curl_exec( $ch );在没有关闭curl_close前,怎么样能访问a.html(这个A.HTML也是www.a.com里的一个页面)
    直接curl_url("a.html")这样可以吗?
      

  10.   

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "http://www.example.com/a.html");
    curl_exec($ch);curl_setopt($ch, CURLOPT_URL, "http://www.example.com/b.html");
    curl_exec($ch);curl_close($ch);