问题描述:
   A主机(北京)用fopen只读方式远程以http方式打开B主机(浙江)的一个文件.结果总是打不开或打开耗时很长。
   A主机用fopen通过C主机(上海)中转打开B主机的一个文件。成功率100%,用时也不长。原来一直怀疑是网络路由的问题。但是用curl方式打开文件却很快。大概比fopen快上一倍。
fopen的效率真的很低.想了好多天,一直没结果。希望知道的高手给个解释,谢谢!
中转代码fopen方式。:<?php
if( isset($_GET[ 'req' ]) ) {
     
     $s = fopen( base64_decode( $_GET[ 'req' ] ),"r" );
     $ret = stream_get_contents( $s, -1 );
     fclose( $s );
     echo   $ret;
}?>
curl方式:
          // CURL 方法
          $ch = curl_init(  );
          curl_setopt( $ch,CURLOPT_URL,$uri );
          curl_setopt( $ch,CURLOPT_HEADER,0 );
          curl_setopt( $ch,CURLOPT_RETURNTRANSFER,1 );
          $ret= curl_exec( $ch );
          curl_close( $ch );
          echo $ret;
    

解决方案 »

  1.   

    如果B主机没有allow url fopen fopen获取内容的话本来就是有一定概率的,即便通过C主机也应该一样curl是通过http协议获取到页面内容的
      

  2.   

    以上fopen也是通过http打开文件的
    fopen("http://....","r");
      

  3.   

    具体区别,你要检查php的源代码了.
    curl用的是libcurl,
    fopen打开url是基于什么原理就不清楚了.
      

  4.   

    顶一下吧,之前写采集的时候,
    我也发现用curl 会比 file_get_contents 要快一些。
    可惜未进行深究,借此处看答案了。
      

  5.   

    其实用socket更快的。只不过后期处理麻烦一些.
              $sock = socket_create( AF_INET,SOCK_STREAM,SOL_TCP );
              socket_connect( $sock,"xxx.xxx.com",80 );
              $request = 'GET '.$uri.' HTTP/1.1'."\r\n".
                   'Host:xxx.xxx.com'."\r\n\r\n";
              
              socket_write( $sock,$request );
              $ret = socket_read( $sock,1024 );