php远程url fread操作的性能问题

时间:2014-04-07 11:49:36

标签: php fopen fread

我的脚本存在性能问题(如下)。 fread操作需要花费很多时间,我得到的时间如下:

$time_split2 == 0.00135s

$time_split3 == 15.01747s

我已经使用远程脚本测试了它,除了回显OK消息之外什么都不做 - 还有aprox。 15秒执行时间

可能是什么问题,或者我怎么能以另一种方式解决它。 我宁愿不使用curl(会加速吗?)因为curl并不总是用PHP安装,我希望我的代码可以移植

    $opts = array('http' =>
      array(
        'method'  => 'POST',
        'header'  => array('Content-type: application/x-www-form-urlencoded', 'Custom-header: test'),
        'content' => $postdata,
        'timeout' => 60
      )
    );
    $context  = stream_context_create($opts);

    $time_split = microtime(true);

    $fp = fopen('http://someremotedomain/script.php', 'r', false, $context);
    $time_split2 = microtime(true);

    while(!feof($fp))
      $result .= fread($fp, 4096);
    fclose($fp);
    $time_split3 = microtime(true);

    $time_split2 = round($time_split2 - $time_split, 5);
    $time_split3 = round($time_split3 - $time_split, 5);

更新

我已经使用了你的建议 - file_get_contents()+ Connection:close - 它还没有工作 - file_get_contents()使用延迟并返回一个空字符串但是 - 我已经隔离了问题,这里是$ POSTDATA:

$postdata = http_build_query(
   array('body' => $mail_html_content,
         'from' => 'test <test@test.com>',
         'to' => 'test2 <test2@test.com>',
        )
);

当我删除&#39; body&#39;从数组 - file_get_contents()工作正常,没有任何延迟 - 这怎么会产生问题 - $ mail_html_content只包含一个简单的HTML字符串,它不是一个大字符串

更新2

我已经更多地隔离了这个问题 - 当$ postdata字符串的长度超过1024个字符时,file_get_contents()开始返回空值,低于该值一切正常,因为方法POST不受长度的限制数据(至少对于如此低的数字)现在可能是什么问题?

1 个答案:

答案 0 :(得分:0)

您应该尝试使用file_get_contents()而不是while(!feof($fp))

E.g。

  /* EDIT: header should be something like that */
$opts = array( 
    'http' => array(
        'method'=>"POST", 
        'header'=>"Content-Type: text/html; charset=utf-8",
    ),
); 
$context  = stream_context_create($opts);
$result = file_get_contents('http://someremotedomain/script.php', false, $context);

有关其他标题信息,请查看here

原因

根据fread文档:

  

注意

     

如果您只想将文件内容转换为字符串,请使用file_get_contents()作为   它比上面的代码有更好的性能。