事情説明
WordPressで作成した「サイトA」のRSSフィードを使用して
「サイトB」にサイトAの更新情報をコンテンツの一部として表示させているのですが、
WordPress側でメンテナンスや障害が発生すると、サイトBで処理待ちリクエストが増え、サイトBまで落ちてしまいます。
ちなみにサイトAはエックスサーバーを使用しており、そちらで少し前に大規模な障害が発生した際には、サイトBまで表示ができなくなっていました。
この問題を回避するためには、サイトAの更新情報をサイトBにiframeで読み込むという手段もあるのですが、これはあまり使いたくないので
タイムアウト処理を導入して一定時間が経ってもサイトAの更新情報を取得できない場合は、
その部分だけ「表示できません」とするなど、処理を分けたいと考えています。
ちなみに、サイトAの更新情報取得には「rss-php」というライブラリを使用しています。
https://kana-lier.com/web/php_rssfeed/
これをカスタマイズしてタイムアウト処理を追加する方法を探しています。
試した事
※どのようにタイムアウト処理を実装するかを考察するためのデモです。 ■test.php <?php //タイムスタンプをマイクロ秒単位で取得 $start = microtime(true); //cURLでコンテンツを取得 $url = "test2.php"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, 60); $json = curl_exec($ch); curl_close($ch); $result = json_decode($json, true); //もし3秒経過してもコンテンツを取得できなかったら if (microtime(true) - $start > 3) { echo '表示できませんでした'; } else{ echo $json; } ?>
■test2.php <?php //5秒間処理を停止 sleep(5); echo '表示できました'; ?>
発生している問題
上記はデモページのソースです。
test2.phpは、sleep関数で5秒間待ってコンテンツを表示するようにしています。
test.phpではmicrotime 関数を使用して、3秒間待ってコンテンツを取得できなければ別の処理をするようにしています。
test2.phpのコンテンツが表示されるまでに5秒掛かるので、test.phpでは「表示できませんでした」という結果が得られます。
microtime 関数を使用して、一定時間過ぎてもコンテンツが取得できなかった場合は表示を変える事はできました。
ですが、このやり方だと、sleep関数を5秒に設定した場合、5秒待って処理を分けるので、結局、サーバーへの負荷という意味では変わらないのかなと…
タイムアウト処理まで3秒と設定したら、きっちり3秒で条件分岐させたいのですが、どのような手法がありますでしょうか?
phpにはあまり詳しくないので恐縮ですが、何卒よろしくお願いいたします。
※最悪、条件分岐しなくても大丈夫です。サイトB全体が落ちない方法があればお願いします。
追記
実際にサイトBで使用しているRSS取得に関するソースは以下のような感じです。
<?php require_once "Feed.php" ; //rss-phpライブラリを読み込みます $feed = new Feed ; $url = "feed_test.php"; //RSSのURL $rss = $feed->loadRss( $url ) ; $link2 = $rss->link; $num = 20;//表示させたい件数 $i=0; $desW = 0;//詳細の文字数を制限します。制限しないときは0にします。 if ( $desW != 0){ $desW = ($desW*2)+2; } // item毎に処理 foreach( $rss->item as $item ) { if($i>=$num){ } else{ $title = $item->title; $author = $item->author; $targetTime = strtotime($item->pubDate); $date = date('Y年n月j日 H:i', strtotime('-0 hour', $targetTime)); $link = $item->link; $content = $item->children('content', true)->encoded; $description = $item->description; ?> rssを使用したコンテンツ <?php $i++; } } ?> <!--▲RSS取得-->




回答1件
あなたの回答
tips
プレビュー