2009-12-27 39 views
1

我需要从通过http访问的非常大的远程XML文件中检索少量数据。我在开始时只需要文件的一部分,但我访问的文件通常会很大,以至于全部下载都会导致超时。它似乎应该可能与fsockopen拉关闭连接之前只需要尽可能多,但没有我试过的工作。PHP:希望fsockopen只检索远程xml文件的一部分

下面是我一直在尝试的简化版本。任何人都可以告诉我我需要做什么改变吗?

<?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

与此代码,你可以下载整个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 
+0

编辑:现在它:-) – richsage 2009-12-27 16:13:08

+0

利己工作?你用你的代码试过了吗? – streetparade 2009-12-27 16:20:56

+0

我仍然试图做这项工作。它需要simplexml_load_file()还是我可以使用它与fsockopen? (这是一个问题,因为一些XML并不总是很好的形成,但我可以用它作为分隔数据,它不是一个RSS提要)。 Jim H. – 2009-12-27 17:49:36

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)); 
+0

删除我的答案,并upvoted你的,因为这是解决问题的最好方法之一。 – 2009-12-27 16:24:42

+0

确定第一我也想用file_get_contents(),但我没有:( – streetparade 2009-12-27 16:26:16

+0

这是有道理的,但是当我尝试它时,我仍然得到在发生任何事情之前下载的整个文件大文件仍然超时有什么我需要做? Jim H. – 2009-12-27 17:46:45