我需要从我通过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
答案 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