人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPの事で伺います。今、fopenを利用して一度に色々なサイトのRSSフィードを取得、解析するプログラムを制作しているのですが。
RSSフィード取得サイト数が多くなると、どうしても処理に時間がかかってしまいます。
そこで、stream_set_blocking(socket_set_blocking)等を使って色々なサイトからRSSフィードを取得するなど、高速に処理するための参考ページを探しています。
ソースが確認できれば、英語のページでもかまいません。
よろしくお願いします。
別にstream_set_blockingにこだわるっているわけではありません。とにかく高速化するための参考ページです。

●質問者: graypenguin
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:PHP RSSフィード サイト ソース プログラム
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● ししゃ
●50ポイント

どの道ファイル全体を読み込むのなら、fopenでハンドルを取得するより、file関数などで一括読み込みしたほうが早くなるのではないでしょうか?

file関数

◎質問者からの返答

回答ありがとうございます。

fopen と file のどちらが処理が早いかに関しては

調べたわけではないのでわかりませんが、どちらにしても1サイトづつ取ってくるのではなく同時に多くのサイトからRSSを取得して処理する方法をご存じないですか?


2 ● ヨネちゃん
●70ポイント

私も似たようなことをしていますが、PHPに対する前回のアクセス時刻を取得して、一定の時間内であれば更新しないようにしています。

具体的には、表示用のHTMLを吐き出すようにしておいて、それをインクルードしているのですが、インクルードするHTMLの更新時刻を取得し、新しければそのままインクルードし、古ければ更新作業を行ってからインクルードしています。

私の場合は緊急を要する内容でもないので、30分くらいは更新する必要がなく、最新の情報と呼べると思っています。1時間ごとの更新に遭遇した人を人柱として、その他大勢の人へ快適なサービスを提供するという考え方ですが、その他大勢には人柱になった人も含まれますので、満更悪い話でもないような気がしています。

あと、実際には使っていないのですが、全てのRSSをグーグルのキャッシュ(HTMLになってます)から取得する方法にすれば、同一のドメインにアクセスするので結構早かったと思います。この場合はページランクの高いRSSに限られます。

参考にならなかったら済みません。

◎質問者からの返答

回答ありがとうございます。

キャッシュは私も考えていました。

MagpiePHPがキャッシュを利用しているようなので、

ソースを見てみようと考えています。

PHPで、JAVA のThreadのようなことって出来ないものなのでしょうか。。。


3 ● katsube
●70ポイント

PHPで、JAVA のThreadのようなことって出来ないものなのでしょうか。。。

子プロセスなら作れるんですが(^^;

http://ir.php.net/manual/ja/function.pcntl-fork.php

もし、何度も実行される場合、

httpでheadしゃべって、更新日やファイルサイズなどをチェックして、以前に取得したファイルから更新されていなければ、そもそも取得しないということも可能です。

http://pear.plus-server.net/package.http.http.head.html

◎質問者からの返答

回答ありがとうございます。

FORKはPerlでよくみる技術ですね。

これで、Threadもどきが作れればいいのですが.

headに関してはRSSが結構プログラムから生成しているサイトがあるので、更新日やファイルサイズで正しく判断出来るかが問題になると思います。

yoneto164さんのキャッシュ、katsubeさんの

FORKとheadの複数技でがんばってみようかな!!

まだ、受け付けているので参考になるようなページがありました宜しくお願いします。

できれば、PHPのマニュアルページではなく

参考プログラミングが書いてあるページでお願いします。(もちろん、マニュアルページ内に参考になるソースがあれば別ですが。)


4 ● はむ!
●100ポイント

あくまでGoogle検索しただけで申し訳ありませんが、

参考になるかと思います。


複数のサイトに同時に接続し、情報を取得する場合の記事です。

解説は英語ですがコードがあります。


スレッドを利用するのではなく、select系の関数によって「各ソケットの変化を検出する」方式を取っています。

(この方法はソケットでの同時接続を扱う場合の至極まっとうな手法です。)


Guru - Multiplexing

http://netevil.org/node.php?uuid=427d6d12-c107-9816-7428-27d6d12...


1つめのコードは同期接続(順番に接続するだけ・・・今までの遅い方法)

2つめのコードは非同期接続(同時に接続する)(PHP5向け)

3つめのコードはPHP4系でext/socketsライブラリを使用する場合の接続関数。


元は雑誌に掲載された記事とのことで、それなりの信頼性はありそうです。

◎質問者からの返答

回答ありがとうございます。

とても参考になるページです!!

ありがとうございます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ