カテゴリー
PHP

URLからXMLファイルの読み込み

XMLデータを指定したURLから読み込むには、

$xml = simplexml_load_file($url);

または、

$xml = simplexml_load_string(file_get_contents($url));

で行えます。しかし、サーバーの設定によって指定した URL がリダイレクトされている場合には、リダイレクト先のURLから読み込みを行ってくれないようです。

例えば、curl_getinfo 関数で、当サイトのブログの RSS フィードを取得してみます。

結果は:

    [url] => https://www.northwind.mydns.jp/samples/blog/feed/
    [content_type] => text/html
    [http_code] => 301
    [header_size] => 348
    [request_size] => 71
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 0
    [total_time] => 1.21189
    [namelookup_time] => 0.003149
    [connect_time] => 0.003198
    [pretransfer_time] => 0.0032
    [size_upload] => 0
    [size_download] => 0
    [speed_download] => 0
    [speed_upload] => 0
    [download_content_length] => 0
    [upload_content_length] => 0
    [starttransfer_time] => 1.211865
    [redirect_time] => 0
    [certinfo] => Array
        (
        )

    [redirect_url] => https://www.northwind.mydns.jp/samples/blog/feed/

http_code が 301 で、redirect_url にリダイレクト先の URL が返されました。

つまり、

$xml = simplexml_load_file("https://www.northwind.mydns.jp/samples/blog/feed/");

では期待していたフィードが得られないというわけです。

リダイレクト先の URL を指定すれば良いのですが、指定した URL がリダイレクトされているか不明の場合もあるので、getXmlFromUrl 関数を作ってみました。

function getXmlFromUrl($url, $defTimeout = 5) {
    $resultSet = false;
    $timeout = $defTimeout; // 0 をセットするとタイムアウトしない

    try {
        $ch = curl_init();

        curl_setopt ($ch, CURLOPT_URL, $url);
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);

        $res = curl_exec($ch);
        $info = curl_getinfo($ch);

        curl_close($ch);    

        if ($res && $info['http_code'] == 200) {
            $resultSet = simplexml_load_string($res);
        } else if ($info['http_code'] == 301) { // リダイレクト!
            $resultSet = getXmlFromUrl($info['redirect_url'], $defTimeout);
        } else {
            $resultSet = false;
        }
    } catch (Exception $e) {
    }

    return $resultSet;
}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください