PHPの事で伺います。今、fopenを利用して一度に色々なサイトのRSSフィードを取得、解析するプログラムを制作しているのですが。

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

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2006/06/23 06:55:35
  • 終了:2006/06/25 13:30:31

回答(4件)

id:sisya No.1

ししゃ回答回数24ベストアンサー獲得回数22006/06/23 12:22:06

ポイント50pt

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

file関数

id:graypenguin

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

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

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

2006/06/23 12:55:45
id:yoneto164 No.2

ヨネちゃん回答回数813ベストアンサー獲得回数942006/06/23 21:09:11

ポイント70pt

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

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

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

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

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

id:graypenguin

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

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

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

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

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

2006/06/23 22:11:40
id:katsube No.3

katsube回答回数133ベストアンサー獲得回数72006/06/23 22:26:43

ポイント70pt

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

id:graypenguin

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

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

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

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

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

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

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

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

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

2006/06/24 09:15:05
id:hammm No.4

はむ!回答回数11ベストアンサー獲得回数02006/06/25 05:43:38

ポイント100pt

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

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


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

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


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

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


Guru - Multiplexing

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


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

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

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


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

id:graypenguin

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

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

ありがとうございます。

2006/06/25 13:26:25

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません