PHP:希望fsockopen仅检索远程xml文件的一部分

时间:2009-12-27 15:33:44

标签: php

我需要从我通过http访问的非常大的远程XML文件中检索少量数据。我一开始只需要文件的一部分,但我访问的文件通常很大,以至于全部下载都会导致超时。似乎fsockopen应该可以在关闭连接之前尽可能多地拉动,但我尝试过的任何东西都没有用。

以下是我一直在尝试的简化版本。谁能告诉我我需要采取哪些不同的做法?

<?php

 $k = 0;

 function socketopen($funcsite, $funcheader){

 $fp = fsockopen ($funcsite, 80, $errno, $errstr, 5);

 $buffer = NULL;

 if ($fp) {

    fwrite($fp, "GET " . $funcheader . " HTTP/1.0\r\nHost: " . $funcsite. "\r\n\r\n");


 while (!feof($fp)) {
    $buffer = fgets($fp, 4096);
    echo $buffer;

    if($k == 200){
        break;
    }
    $k++;
  }

    fclose ($fp);
  } else {
    print "No Response:";
 }
 return ( html_entity_decode($buffer));
}

$site = "www.remotesite.com";
$header = "/bigdatafile.xml";
$data = socketopen($site, $header);
?>

这很好用,但总是打开并下载整个远程文件。 (我实际上使用了与if($ k = x)不同的条件,但这无关紧要。)

任何帮助非常感谢。 -Jim

2 个答案:

答案 0 :(得分:4)

任何不使用file_get_contents()的理由?

$buffer = html_entity_decode(file_get_contents('http://www.remotesite.com/bigdatafile.xml', 0, null, $offsetBytes, $maxlenBytes));

您只需指定$offsetBytes$maxlenBytes


试试这个:

set_time_limit(0);

echo $buffer = html_entity_decode(file_get_contents('http://www.remotesite.com/bigdatafile.xml', 0, null, 1024, 4096));

答案 1 :(得分:0)

使用此代码可以下载整个rss

  if (!$xml = simplexml_load_file("http://remotesite.com/bigrss.rss))
    {
       throw new RuntimeException('Unable to load or parse  feed');
    }

  else
  {
    file_put_contents($xml,'mybigrss.rss'); 
  }

但如果您想获得一些零件,请执行以下操作;

$limit = 512000; // set here a limit 
$sourceData = fread($s_handle,$limit); 

// your code ect..

或者使用eof

$source='';
while (!feof($s_handle))
$source.=fread($s_handle,1024); // set limit