TERMS:
GD = Godaddy
SO = Stackoverflow
我一直在研究如何解析远程xml文件(和缓存)。有问题的远程XML是8-10mb,所以不是那么大,但是当我创建访问它的网站时,会出现同样的问题(我在GD上主持,但在本地测试 - 本地不是很大的问题,GD非常频繁) ,XML过早被切断,导致文件不完整。 GD不会让我刷新,在本地它通常可以在第二次或第三次使用。这是我多年来按照从最旧到最近(2017年)的顺序使用的以下方法。我发现的大部分内容,除了最近的内容,都是在SO。
这个曾经在几年前xml较小时工作:
COPY(REMOTE, DEST);// simple :-)
大约一年前,我注意到失败越来越多,所以我改用了这个(短期):
function download($src, $dst)
{
$dst = GAME_CACHE_ROOT.$dst;
$f = fopen($src, 'rb');
$o = fopen($dst, 'wb');
while (!feof($f)) {
if (fwrite($o, fread($f, 2048)) === FALSE) {
return 1;
}
}
fclose($f);
fclose($o);
return 0;
}
大多数情况下运作得相当好,但最终又变得混乱了。
跳过其他一些黑客方式,我遇到了这个,应该有效,但只有运气本地,GD它工作了一两次,现在又失败了
$xmlFile = $POST['xmlFile'];
$reader = new XMLReader(); //load the selected XML file to the DOM
//$reader->open('saved/'.$xmlFile); // could be remote bfg
$reader->open(BFG_REMOTE_XML);
while ($reader->read()):
if ($reader->nodeType XMLReader::ELEMENT && $reader->name 'game'){
$node = new SimpleXMLElement($reader->readOuterXML());
$info = $node->elementName; //push those values to an array for evaluation arraypush($info,$callStack);
}
endwhile;
(尽量不要在“结束......”控制中发出嘎嘎声,在更大的程序中我发现它们更容易追踪 - 个人偏好)。这没有按照预期运作良好,因此改为:
// GRAB THE NEW DATA FROM HOST.
$xml = "http://rss.*****.com/rss.php?username=*****&type=6&locale=en&gametype=pc";
$file = 'big.xml';
$reader = new XMLReader();// Stream it...
$reader->open($xml);
while($reader->read()){
if( $reader->nodeType == XMLReader::ELEMENT && $reader->name == 'game'){
$game = new SimpleXMLElement($reader->readOuterXML());
// process game as needed
// ..rest of file....
这在本地工作非常好,但在GD上只有几次,我不断得到的错误是标准的:
Warning: XMLReader::readOuterXml(): http://rss.*****.com/rss.php?username=*****&type=6&locale=en&gametype=pc:50384: parser error : Extra content at the end of the document in /home/*****/public_html/functions/cron.php on line 39
Warning: XMLReader::readOuterXml(): amename>Final Cut: Death on the Silver Screen Collector's Edition</gamename in /home/*****/public_html/functions/cron.php on line 39
Warning: XMLReader::readOuterXml(): ^ in /home/*****/public_html/functions/cron.php on line 39
Fatal error: Uncaught exception 'Exception' with message 'String could not be parsed as XML' in /home/*****/public_html/functions/cron.php:39 Stack trace: #0 /home/*****/public_html/functions/cron.php(39): SimpleXMLElement->__construct('') #1 /home/klyxmaster/public_html/functions/cron.php(168): updatedb(900) #2 {main} thrown in /home/*****/public_html/functions/cron.php on line 39
正如你所知,这个错误只是文件不完整(我在文本编辑器中验证了它,当然,它随机被砍掉了。
我错过了什么?我相信我已经拥有远程抓取大型XML文件的所有方法。