質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
RSS

RSS(Really Simple Syndication)はブログのエントリやニュースの見出し、標準のフォーマットの音声やビデオなどを発行するために使われるウェブフィードのフォーマットの集合体です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

受付中

PHPでのRSSフィードを取得する

kumagaya31
kumagaya31

総合スコア0

RSS

RSS(Really Simple Syndication)はブログのエントリやニュースの見出し、標準のフォーマットの音声やビデオなどを発行するために使われるウェブフィードのフォーマットの集合体です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

1回答

0評価

0クリップ

1569閲覧

投稿2021/07/23 09:45

編集2022/01/12 10:55

前提・実現したいこと

PHP初学者です。
rss-phpを使用して、RSSフィードを取得する練習をしているのですが、色々なサイトで試していると、下記のようなエラーが表示されてしまいます。

かなり初歩的な質問かと思うのですが、何かご教示いただけたら幸いです。

発生している問題・エラーメッセージ

Fatal error: Uncaught FeedException: Cannot load feed. in /Applications/MAMP/htdocs/question3/Feed.php:193 Stack trace: #0 /Applications/MAMP/htdocs/question3/Feed.php(54): Feed::loadXml('https://techaca...', NULL, NULL) #1 /Applications/MAMP/htdocs/question3/sample.php(16): Feed::loadRss('https://techaca...') #2 {main} thrown in /Applications/MAMP/htdocs/question3/Feed.php on line 193

Sample.php

PHP

<?php ini_set( 'display_errors', 1 ); ini_set( 'error_reporting', E_ALL ); require_once "./Feed.php" ; $url = "https://techacademy.jp/magazine/feed" ; $feed = new Feed ; $rss = $feed->loadRss( $url ) ; $html = '' ; foreach( $rss->item as $item ) { $title = $item->title ; $link = $item->link ; $description = $item->description ; foreach( array( "pubDate" , "date_timestamp" , "dc:date" , "published" , "issued" ) as $time ) { if( isset( $item->{ $time } ) && !empty( $item->{ $time } ) ) { $timestamp = ( is_int( $item->{ $time } ) ) ? $item->{ $time } : strtotime( $item->{ $time } ) ; break ; } } if( !isset( $timestamp ) ) { $timestamp = time() ; } $html .= '<a href="' . $link . '">' . $title . '</a> (' . date( "Y/m/d H:i" , $timestamp ) . ')<br>' ; } ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> </head> <body> <?php echo $html ?> </body> </html>

Feed.php

PHP

<?php /** * RSS for PHP - small and easy-to-use library for consuming an RSS Feed * * @copyright Copyright (c) 2008 David Grudl * @license New BSD License * @version 1.5 */ class Feed { /** @var int */ public static $cacheExpire = '1 day'; /** @var string */ public static $cacheDir; /** @var string */ public static $userAgent = 'FeedFetcher-Google'; /** @var SimpleXMLElement */ protected $xml; /** * Loads RSS or Atom feed. * @param string * @param string * @param string * @return Feed * @throws FeedException */ public static function load($url, $user = null, $pass = null) { $xml = self::loadXml($url, $user, $pass); if ($xml->channel) { return self::fromRss($xml); } else { return self::fromAtom($xml); } } /** * Loads RSS feed. * @param string RSS feed URL * @param string optional user name * @param string optional password * @return Feed * @throws FeedException */ public static function loadRss($url, $user = null, $pass = null) { return self::fromRss(self::loadXml($url, $user, $pass)); } /** * Loads Atom feed. * @param string Atom feed URL * @param string optional user name * @param string optional password * @return Feed * @throws FeedException */ public static function loadAtom($url, $user = null, $pass = null) { return self::fromAtom(self::loadXml($url, $user, $pass)); } private static function fromRss(SimpleXMLElement $xml) { if (!$xml->channel) { throw new FeedException('Invalid feed.'); } self::adjustNamespaces($xml); foreach ($xml->channel->item as $item) { // converts namespaces to dotted tags self::adjustNamespaces($item); // generate 'url' & 'timestamp' tags $item->url = (string) $item->link; if (isset($item->{'dc:date'})) { $item->timestamp = strtotime($item->{'dc:date'}); } elseif (isset($item->pubDate)) { $item->timestamp = strtotime($item->pubDate); } } $feed = new self; $feed->xml = $xml->channel; return $feed; } private static function fromAtom(SimpleXMLElement $xml) { if (!in_array('http://www.w3.org/2005/Atom', $xml->getDocNamespaces(), true) && !in_array('http://purl.org/atom/ns#', $xml->getDocNamespaces(), true) ) { throw new FeedException('Invalid feed.'); } // generate 'url' & 'timestamp' tags foreach ($xml->entry as $entry) { $entry->url = (string) $entry->link['href']; $entry->timestamp = strtotime($entry->updated); } $feed = new self; $feed->xml = $xml; return $feed; } /** * Returns property value. Do not call directly. * @param string tag name * @return SimpleXMLElement */ public function __get($name) { return $this->xml->{$name}; } /** * Sets value of a property. Do not call directly. * @param string property name * @param mixed property value * @return void */ public function __set($name, $value) { throw new Exception("Cannot assign to a read-only property '$name'."); } /** * Converts a SimpleXMLElement into an array. * @param SimpleXMLElement * @return array */ public function toArray(SimpleXMLElement $xml = null) { if ($xml === null) { $xml = $this->xml; } if (!$xml->children()) { return (string) $xml; } $arr = []; foreach ($xml->children() as $tag => $child) { if (count($xml->$tag) === 1) { $arr[$tag] = $this->toArray($child); } else { $arr[$tag][] = $this->toArray($child); } } return $arr; } /** * Load XML from cache or HTTP. * @param string * @param string * @param string * @return SimpleXMLElement * @throws FeedException */ private static function loadXml($url, $user, $pass) { $e = self::$cacheExpire; $cacheFile = self::$cacheDir . '/feed.' . md5(serialize(func_get_args())) . '.xml'; if (self::$cacheDir && (time() - @filemtime($cacheFile) <= (is_string($e) ? strtotime($e) - time() : $e)) && $data = @file_get_contents($cacheFile) ) { // ok } elseif ($data = trim(self::httpRequest($url, $user, $pass))) { if (self::$cacheDir) { file_put_contents($cacheFile, $data); } } elseif (self::$cacheDir && $data = @file_get_contents($cacheFile)) { // ok } else { throw new FeedException('Cannot load feed.'); } return new SimpleXMLElement($data, LIBXML_NOWARNING | LIBXML_NOERROR | LIBXML_NOCDATA); } /** * Process HTTP request. * @param string * @param string * @param string * @return string|false * @throws FeedException */ private static function httpRequest($url, $user, $pass) { if (extension_loaded('curl')) { $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); if ($user !== null || $pass !== null) { curl_setopt($curl, CURLOPT_USERPWD, "$user:$pass"); } curl_setopt($curl, CURLOPT_USERAGENT, self::$userAgent); // some feeds require a user agent curl_setopt($curl, CURLOPT_HEADER, false); curl_setopt($curl, CURLOPT_TIMEOUT, 20); curl_setopt($curl, CURLOPT_ENCODING, ''); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // no echo, just return result if (!ini_get('open_basedir')) { curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); // sometime is useful :) } $result = curl_exec($curl); return curl_errno($curl) === 0 && curl_getinfo($curl, CURLINFO_HTTP_CODE) === 200 ? $result : false; } else { $context = null; if ($user !== null && $pass !== null) { $options = [ 'http' => [ 'method' => 'GET', 'header' => 'Authorization: Basic ' . base64_encode($user . ':' . $pass) . "\r\n", ], ]; $context = stream_context_create($options); } return file_get_contents($url, false, $context); } } /** * Generates better accessible namespaced tags. * @param SimpleXMLElement * @return void */ private static function adjustNamespaces($el) { foreach ($el->getNamespaces(true) as $prefix => $ns) { $children = $el->children($ns); foreach ($children as $tag => $content) { $el->{$prefix . ':' . $tag} = $content; } } } } /** * An exception generated by Feed. */ class FeedException extends Exception { }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

attakei

2021/07/23 10:36

出力されたエラーは、末尾に > ... thrown in /Applications/MAMP/htdocs/question3/Feed.php on line 193 とあるようにFeed.phpの側で起きていることを示しています。 少なくとも現在掲載されているコードはFeed.phpではないため、仮にFeed.phpに直接的な問題があるにしても、回答自体が誰もできないと思います。 まずは、Feed.phpの掲載をしたほうが良いでしょう。
kumagaya31

2021/07/23 10:53

ありがとうございます。追加いたしました。
kumagaya31

2021/07/23 11:45 編集

ありがとうございます。 そうです。最新版をダウンロードしました。
m.ts10806

2021/07/23 11:46

github最新ソース読み込みで試しましたが当該エラー出ずに、想定の出力をしているように見受けられます(ローカル環境のCLI実行です) <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> </head> <body> <a href="https://techacademy.jp/magazine/66916">小学生の習い事におすすめしたい「プログラミング教室」</a> (2021/06/10 18:26)<br>(中略) </body> </html>
kumagaya31

2021/07/23 14:34

ありがとうございます。 改めて試してみましたが、同様のエラーが出てしまいます。 実行環境の問題でしょうか。。。
m.ts10806

2021/07/23 19:52

では、OS含めてバージョンなど、環境構築の手順も分かる限り追記してもらって良いですか?

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

RSS

RSS(Really Simple Syndication)はブログのエントリやニュースの見出し、標準のフォーマットの音声やビデオなどを発行するために使われるウェブフィードのフォーマットの集合体です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。