Bug(バグ) #1684
完了サイドバナーのRSSリーダーで読み込めない時がある
100%
説明
現象¶
(http://sns.openpne.jp/communityTopic/6318 より転記)
サイドバナーへRSSリーダーを登録しているのですが、
読み込み先によって、
画面の表示が「サーバーが混雑しています~」のような表示になってしまいます。
再現環境¶
サーバー:
- CentOS Linux 5.5
- MySQL version 5.0.91
- php 5.2.13
OpenPNEのバージョン:
- OpenPNE3.4.6.2
再現手順¶
こちらのRSSを登録する(8月28日23時ごろ)
http://video.baidu.jp/api/search?word=%E3%83%90%E3%82%A4%...
最初はずっと表示されていましたので、時間がたつと内容が変わりますので、表示されるようになるかもしれません。
サーバーのエラーログ:
PHP Fatal error: Uncaught exception 'sfException' with message 'Impossible to parse date "" with format "yyyy-MM-dd HH:mm:ss".' in /www/lib/vendor/symfony/lib/i18n/sfDateFormat.class.php:186\n Stack trace:\n #0 /www/lib/vendor/symfony/lib/i18n/sfDateFormat.class.php(219): sfDateFormat->getDate('', NULL)\n #1 /www/lib/vendor/symfony/lib/helper/DateHelper.php(60): sfDateFormat->format('', 'MM???dd???', NULL, 'utf-8')\n #2 /www/lib/helper/opUtilHelper.php(333): format_date('', 'MM???dd???', 'ja_JP', NULL)\n #3 /www/apps/pc_frontend/modules/default/templates/_rssBox.php(7): op_format_date('', 'XShortDateJa')\n #4 /www/cache/apache/pc_frontend/prod/config/config_core_compile.yml.php(3810): require('...')\n #5 /www/lib/vendor/symfony/lib/view/sfPartialView.class.php(110): sfPHPView->renderFile('...')\n #6 /www/lib/vendor/symfony/lib/helper/PartialHelper.php(155): sfPartialView->render()\n #7 /var/www/r in /www/lib/vendor/symfony/lib/i18n/sfDateFormat.class.php on line 186
原因¶
規定外のRSSを受信した場合などに、パースに失敗し例外により処理が中断されるため。
修正内容¶
ガジェット側ですべての例外を catch して、適切な表示になるように修正するべきです。
具体的には、note-3 にあるように
diff --git a/apps/pc_frontend/modules/default/actions/components.class.php b/apps/pc_frontend/modules/def index 097703c..ad79046 100644 --- a/apps/pc_frontend/modules/default/actions/components.class.php +++ b/apps/pc_frontend/modules/default/actions/components.class.php @@ -95,11 +95,17 @@ class defaultComponents extends sfComponents public function executeRssBox() { - $fetcher = new opRssFetcher('UTF-8'); - $this->result = @$fetcher->fetch($this->gadget->getConfig('url'), true); - if ($this->result) + try + { + $fetcher = new opRssFetcher('UTF-8'); + $this->result = @$fetcher->fetch($this->gadget->getConfig('url'), true); + if ($this->result) + { + $this->result[1] = array_slice($this->result[1], 0, 5); + } + } + catch (Exception $e) { - $this->result[1] = array_slice($this->result[1], 0, 5); } }のような変更で十分かと思われます。
Kousuke Ebihara さんが約14年前に更新
- 優先度 を Normal(通常) から High(高め) に変更
- 対象バージョン を OpenPNE 3.7.0 にセット
- 3.6 で発生するか を Yes にセット
その RSS の内容に問題があると思いますが、それによって画面の表示ができなくなるのは重大な問題だと思います。
ガジェット側ですべての例外を catch して、適切な表示になるように修正するべきです。
Naoya Tozuka さんが13年以上前に更新
- ステータス を New(新規) から Pending Fixing(修正待ち) に変更
ガジェット側ですべての例外を catch して、適切な表示になるように修正するべきです。
以下のような対処で十分と思われます。
diff --git a/apps/pc_frontend/modules/default/actions/components.class.php b/apps/pc_frontend/modules/def index 097703c..ad79046 100644 --- a/apps/pc_frontend/modules/default/actions/components.class.php +++ b/apps/pc_frontend/modules/default/actions/components.class.php @@ -95,11 +95,17 @@ class defaultComponents extends sfComponents public function executeRssBox() { - $fetcher = new opRssFetcher('UTF-8'); - $this->result = @$fetcher->fetch($this->gadget->getConfig('url'), true); - if ($this->result) + try + { + $fetcher = new opRssFetcher('UTF-8'); + $this->result = @$fetcher->fetch($this->gadget->getConfig('url'), true); + if ($this->result) + { + $this->result[1] = array_slice($this->result[1], 0, 5); + } + } + catch (Exception $e) { - $this->result[1] = array_slice($this->result[1], 0, 5); } }
Naoya Tozuka さんが13年以上前に更新
- ステータス を Accepted(着手) から Pending Review(レビュー待ち) に変更
- 進捗率 を 0 から 50 に変更
ceae6c56 で対応しました。レビュー宜しくお願いします。
Masato Nagasawa さんが13年以上前に更新
- ステータス を Pending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
- 進捗率 を 50 から 70 に変更
レビューはOKですが、
Descriptionのフォーマットの統一をお願いします。
Maki Takahashi さんが約13年前に更新
- ステータス を Pending Testing(テスト待ち) から Rejected(差し戻し) に変更
- 担当者 を Naoya Tozuka から Yuya Watanabe に変更
- 進捗率 を 70 から 50 に変更
BP先でのテストによって、差し戻しされておりますので元チケットも差し戻しいたします。
wa ta さんが約13年前に更新
- ステータス を Rejected(差し戻し) から Pending Review(レビュー待ち) に変更
更新履歴 1d880d6c61e8b6cf4c1200170c6eb0d3e01b0da9 で適用されました。
Yuya Watanabe さんが約13年前に更新
バックポート先で指摘された問題について¶
参考:http://redmine.openpne.jp/issues/2273#note-8
本チケットに記載されたRSSフィードのURLにおいては,下記部分で$entry['date']で空文字列が与えられていることが原因です.
ここで$entry['date']が空文字列であった場合でも適切な文字列をop_format_date()に与えることで解決できると思われます.
apps/pc_frontend/modules/default/templates/_rssBox.php
6 <?php foreach ($result[1] as $entry): ?> 7 <li><span class="date"><?php echo op_format_date($entry['date'], 'XShortDateJa') ?></span> 8 <?php echo link_to($entry['title'], $entry['link']) ?>
特殊文字がRSSフィードのURLに含まれている場合に正しい結果を取得できない問題について¶
このチケットの例で得られるRSSフィードがおかしいので以下の部分でRSSフィードをフェッチしている部分に注目してみました.
apps/pc_frontend/modules/default/actions/components.class.php
98 try 99 { 100 $fetcher = new opRssFetcher('UTF-8'); 101 $this->result = @$fetcher->fetch($this->gadget->getConfig('url'), true); 102 if ($this->result) 103 { 104 $this->result[1] = array_slice($this->result[1], 0, 5); 105 } 106 }
ここで101行目で$this->gadget->getconfig('url')がそのまま用いられていることが気になったので出力を行ってみました.
すると下記のような文字列が得られました.
http://video.baidu.jp/api/search?word=バイク&output=rss&start=0&count=12&sort=dt_recent&adult_filter=1
これをhtmlspecialchars_decode()によってデコードしてみると下記のようになり,最新の結果が得られました.
http://video.baidu.jp/api/search?word=バイク&output=rss&start=0&count=12&sort=dt_recent&adult_filter=1
この部分を加味するに,本チケットにおける問題の本質としては「URLに特殊記号が含まれる場合に正しい結果を得られない」というところなのではないかと思いました.
この問題については #2408 で対応を行うことにしました.
管理画面ガジェット設定で&などのエスケープ文字を入力すると元の文字で表示される問題について¶
参考:http://redmine.openpne.jp/issues/2273#note-11
サイドバーガジェット設定画面(pc_backend.php/design/gadget/type/sideBanner)において,ガジェットの設定画面において「設定変更」部分に「URL」の欄が存在します.
この「URL」の欄にも気になる点があったので調べてみました.
- サイドバーガジェット設定画面でRSSリーダーを2つ追加
- それぞれのRSSリーダーにおいて「URL」に以下の2つのURLを入力して設定を保存
- RSSリーダー1
http://video.baidu.jp/api/search?word=バイク&output=rss&start=0&count=12&sort=dt_recent&adult_filter=1
- RSSリーダー2
http://video.baidu.jp/api/search?word=バイク&output=rss&start=0&count=12&sort=dt_recent&adult_filter=1
- RSSリーダー1
- その後「設定変更」部分に「URL」の欄を確認
- RSSリーダー1
http://video.baidu.jp/api/search?word=バイク&output=rss&start=0&count=12&sort=dt_recent&adult_filter=1
- RSSリーダー2
http://video.baidu.jp/api/search?word=バイク&output=rss&start=0&count=12&sort=dt_recent&adult_filter=1
- RSSリーダー1
- 下記のようにコードを編集して確認.
lib/form/doctrine/GadgetConfigForm.class.php:43行目に値を出力するコードを挿入.40 $config = Doctrine::getTable('GadgetConfig')->retrieveByGadgetIdAndName($gadget->getId(), $key); 41 if ($config) 42 { 43 var_dump($config->getValue()); 44 $this->setDefault($key, $config->getValue()); 45 }
- RSSリーダー1
http://video.baidu.jp/api/search?word=バイク&output=rss&start=0&count=12&sort=dt_recent&adult_filter=1
- RSSリーダー2
http://video.baidu.jp/api/search?word=バイク&output=rss&start=0&count=12&sort=dt_recent&adult_filter=1
- RSSリーダー1
この問題については #2407 で対応を行うことにしました.
Kousuke Ebihara さんが約13年前に更新
- ステータス を Pending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
- 進捗率 を 50 から 70 に変更