Проблемы с загрузкой RSS-каналов с помощью PHP SimpleXML: время ожидания соединения и пустые каналы - PullRequest
0 голосов
/ 20 ноября 2018

Я могу успешно анализировать многие RSS-каналы с помощью PHP SimpleXML.Есть два конкретных канала, которые мне трудно читать с помощью PHP SimpleXML.Оба эти канала отображаются нормально в моем браузере.

Канал Bloomberg, похоже, не возвращает никаких данных:

https://www.bloomberg.com/politics/feeds/site.xml

В лентах тем по вопросам здравоохранения время ожидания подключения:

https://www.healthaffairs.org/action/showFeed?ui=0&mi=3h0nmj&type=search&feed=rss&query=%26ConceptID%3D932%26content%3DarticlesChapters%26target%3Dtopic

Я пробовал разные URL-кодировки с помощью Health Affairs и установки различных параметров контекста потока с помощью libxml_set_streams_context.Вот пример кода, который я использую для открытия этих соединений.

$opts = array( 'http' => array( 'timeout' => 10 ) );
$context = stream_context_create( $opts );
libxml_set_streams_context( $context );
libxml_use_internal_errors( true );
$rss = simplexml_load_file( $feed );

$error_msg = '';
if ( $rss === false ) {
    foreach( libxml_get_errors() as $error ) {
        $error_msg .= ' [' . $error->message . ']';
    }
    libxml_clear_errors();
}

// ...feed parsing

Кажется, что Curl возвращает HTML-страницу с вопросом, являюсь ли я роботом для Bloomberg.Для новостных лент по здравоохранению curl получает тайм-аут.Я пробовал разные варианты с curl, включая проверку, является ли это содержимым gzip.

// create curl resource
$ch = curl_init();

// set url
curl_setopt($ch, CURLOPT_URL, $feed);

//return the transfer as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt($ch, CURLOPT_FAILONERROR, 1 );
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1 );
curl_setopt($ch, CURLOPT_TIMEOUT, 15 );
curl_setopt($ch, CURLOPT_ENCODING, "gzip" );

// $output contains the output string
$debug_output .= '[RSS FEED: ' . $feed . ']' . "\n";
$debug_output .= curl_exec( $ch );

// close curl resource to free up system resources
curl_close($ch);
...