目前,我正在抓取远程站点的XML提要并在我的服务器上保存本地副本以便在PHP中进行解析。
问题是如何在PHP中添加一些检查以查看feed.xml文件是否有效,如果是,请使用feed.xml。
如果错误无效(有时远程XML提要显示空白的feed.xml),请从之前的抓取/保存中提供feed.xml的备份有效副本吗?
代码抓取feed.xml
<?php
/**
* Initialize the cURL session
*/
$ch = curl_init();
/**
* Set the URL of the page or file to download.
*/
curl_setopt($ch, CURLOPT_URL,
'http://domain.com/feed.xml');
/**
* Create a new file
*/
$fp = fopen('feed.xml', 'w');
/**
* Ask cURL to write the contents to a file
*/
curl_setopt($ch, CURLOPT_FILE, $fp);
/**
* Execute the cURL session
*/
curl_exec ($ch);
/**
* Close cURL session and file
*/
curl_close ($ch);
fclose($fp);
?>
到目前为止只有这个加载它
$xml = @simplexml_load_file('feed.xml') or die("feed not loading");
感谢
答案 0 :(得分:4)
如果curl不应该直接写入文件,那么你可以在重新编写本地feed.xml之前检查XML:
<?php
/**
* Initialize the cURL session
*/
$ch = curl_init();
/**
* Set the URL of the page or file to download.
*/
curl_setopt($ch, CURLOPT_URL, 'http://domain.com/feed.xml');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$xml = curl_exec ($ch);
curl_close ($ch);
if (@simplexml_load_string($xml)) {
/**
* Create a new file
*/
$fp = fopen('feed.xml', 'w');
fwrite($fp, $xml);
fclose($fp);
}
?>
答案 1 :(得分:3)
这个怎么样?如果您只需要检索文档,则无需使用curl。
$feed = simplexml_load_file('http://domain.com/feed.xml');
if ($feed)
{
// $feed is valid, save it
$feed->asXML('feed.xml');
}
elseif (file_exists('feed.xml'))
{
// $feed is not valid, grab the last backup
$feed = simplexml_load_file('feed.xml');
}
else
{
die('No available feed');
}
答案 2 :(得分:0)
在我组成的一个类中,我有一个函数可以检查远程文件是否存在以及它是否及时响应:
/**
* Check to see if remote feed exists and responding in a timely manner
*/
private function remote_file_exists($url) {
$ret = false;
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_NOBODY, true); // check the connection; return no content
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1); // timeout after 1 second
curl_setopt($ch, CURLOPT_TIMEOUT, 2); // The maximum number of seconds to allow cURL functions to execute.
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.0; da; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11');
// do request
$result = curl_exec($ch);
// if request is successful
if ($result === true) {
$statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($statusCode === 200) {
$ret = true;
}
}
curl_close($ch);
return $ret;
}
完整的类包含后备代码,以确保我们始终可以使用。
解释完整课程的博客文章位于:http://weedygarden.net/2012/04/simple-feed-caching-with-php/