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; }