Возникли проблемы при создании локальной копии XML-канала с использованием php - PullRequest
0 голосов
/ 21 сентября 2011

Я пытаюсь сохранить локальную копию файла 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

Я не уверен, почему это будет слишком большим результатом, он возвращает только 6 КБ xml. что я делаю не так?

Обновление: Это работает на платформе Windows с использованием WAMP-сервера - не идеально, но я застрял с ним.

Обновление 2: Я попытался использовать curl и fwrite для достижения аналогичного результата, как предложено ниже, но он не записывает xml-файл на локальный сервер. Это не дает мне никаких ошибок.

обновление 3: Это, очевидно, очень специфическая проблема со средой хостинга, но я не уверен, где начать искать проблему. Использование curl прекрасно работает на dev-сервере под управлением Linux, но вызывает проблемы на этом рабочем сервере под управлением Windows. Буду признателен за дополнительную помощь в устранении этой проблемы!

Ответы [ 2 ]

2 голосов
/ 26 сентября 2011

Правильный ответ на вопрос:

Возможно, у вас возникла та же проблема, что и в этом вопросе: CURL и HTTPS, "Не удается разрешить хост" (DNS-Issue)


Другие детали:

Вы можете использовать SimpleXML для загрузки и сохранения данных XML

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

IЯ проверил приведенный выше код на сервере WAMP, и он работает нормально.

Обновление: Если приведенное выше возвращает сообщение об ошибке "[simplexmlelement .-- construct]: предупреждение ввода / вывода: не удалосьзагрузить внешнюю сущность .... "Возможно, ваш сервер не позволяет включать внешние данные или у php-файла / сценария нет необходимых прав доступа.

Попробуйте выполнить следующее:1. Отобразите содержимое XML-файла.

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

Если вам удалось извлечь XML-содержимое и распечатать его в браузере, то ваш сервер позволяет включать внешний контент и, скорее всего, проблема сразрешение файла.Убедитесь, что у файла / скрипта есть право на создание XML-файла.

Если вышеописанное не помогает, попробуйте использовать cURL.

<code>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 '
';}
1 голос
/ 21 сентября 2011

Вы пытались использовать 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);
...