使用php制作xml feed的本地副本时遇到问题

时间:2011-09-21 17:04:33

标签: php simplexml file-get-contents

我正在尝试保存xml文件的本地副本,然后使用简单的xml打开它,但是我收到了一些错误..这是我的代码:

$feedURL = "https://gdata.youtube.com/feeds/api/users/manitobachildhealth/favorites";

//$xml = file_get_contents("$feedURL");
$xml = file_get_contents($feedURL);
file_put_contents("video.xml", $xml);


// read feed into SimpleXML object
//$sxml = simplexml_load_file($feedURL);
$sxml = simplexml_load_file('video.xml');

我得到的错误如下:

Warning: file_get_contents(https://gdata.youtube.com/feeds/api/users/manitobachildhealth/favorites) [function.file-get-contents]: failed to open stream: Result too large in D:\wamp\www\videos2.php on line 48

我不确定为什么结果太大,它只返回6kb的xml。我做错了什么?

更新 这是在使用WAMP服务器的Windows平台上运行 - 不理想,但我坚持使用它。

更新2: 我已经尝试使用curl和fwrite来实现类似的结果,如下所示,但它不会将xml文件写入本地服务器。但它并没有给我任何错误。

更新3: 这显然是托管环境的一个非常具体的问题,但我不知道从哪里开始寻找问题。使用curl在基于linux的开发服务器上运行良好,但在这个基于Windows的生产服务器上引起了问题。非常感谢您解决此问题的额外帮助!

2 个答案:

答案 0 :(得分:2)

问题的正确答案:

您可能遇到与此问题相同的问题:CURL and HTTPS, "Cannot resolve host"(DNS-Issue)


其他详细信息:

您可以使用SimpleXML加载和保存xml数据

$xml = new SimpleXMLElement('https://gdata.youtube.com/feeds/api/users/manitobachildhealth/favorites', NULL, TRUE);
$xml->asXML('video.xml');

我在WAMP服务器上测试了上面的代码,它运行正常。

<强>更新 如果上面返回错误消息“[simplexmlelement .-- construct]:I / O警告:无法加载外部实体....”您的服务器可能不允许包含外部数据或php文件/脚本不有权利。

请尝试以下方法:
1.回显xml文件的内容。

$xml = new SimpleXMLElement('https://gdata.youtube.com/feeds/api/users/manitobachildhealth/favorites', NULL, TRUE);
echo htmlentities($xml->asXML());

如果您设法检索xml内容并将其打印到浏览器,那么您的服务器允许包含外部内容,并且很可能是文件权限问题。确保文件/脚本有权创建xml文件。

如果仍然无法使用cURL。

function getPageContent($options)
{
    $default = array(
        'agent' => $_SERVER['HTTP_USER_AGENT'],
        'url' => '',
        'referer' => 'http://'.$_SERVER['HTTP_HOST'],
        'header' => 0,
        'timeout' => 5,
        'user' => '',
        'proxy' => '',
    );
    $options = array_merge($default, $options);

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $options['url']);
    curl_setopt($ch, CURLOPT_HEADER, $options['header']);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    if ($options['proxy'] != '') {
        curl_setopt($ch, CURLOPT_PROXY, $options['proxy']);
    }
    curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 0);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $options['timeout']);
    curl_setopt($ch, CURLOPT_REFERER, $options['referer']);
    curl_setopt($ch, CURLOPT_USERAGENT, $options['agent']);
    if ($options['user'] != '') {
        curl_setopt($ch, CURLOPT_PROXYUSERPWD, $options['user']);
    }

    $result = array();
    $result['content'] = curl_exec($ch);
    $result['info'] = curl_getinfo($ch);
    $result['error'] = curl_error($ch);

    curl_close($ch);

    return $result;
}

$result = getPageContent(array(
    'proxy' => '[ip or address]:[port]', // if needed 
    'user' => '[username]:[password]',   // if needed
    'url' => 'http://gdata.youtube.com/feeds/api/users/manitobachildhealth/favorites'
));

if (empty($result['error'])) {
    // ok

    // content of xml file
    echo htmlentities($result['content']);

    // file
    $filename = 'video.xml';
    // Open File
    if (!$fp = fopen($filename, 'wt')) {
        die("Unable to open '$filename'\n\n");
    }
    // write content to file
    fwrite($fp, $result['content']);
    // close file
    fclose($fp);

} else {

    // failed
    echo '<pre>';
    echo 'Error details;';
    print_r ($result['error']);
    echo '<hr />Other info:';
    print_r ($result['info']);
    echo '</pre>';
}

答案 1 :(得分:1)

您是否尝试过使用curl和fwrite获取内容并将其写入本地文件?

$ch = curl_init("https://gdata.youtube.com/feeds/api/users/manitobachildhealth/favorites");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);       
curl_close($ch);

fwrite("video.xml",$output);