BLOGTIMES
2007/09/22

続・PHPでマルチタスク?

 
このエントリーをはてなブックマークに追加

先日のPHPでselect()を使う方法についてはもうちょっと色々調べてみたら、英語だけどこっちのエントリの方が詳しく載っていました。さらに、PHP4でうまく動かす方法も解説されています。

Guru - Multiplexing - Evil, as in Dr.

IBMの記事を読んだときにはstream_select()やsocket_select()がPHP4.3以上対応なので、PHP5でないといけない理由がいまひとつ良くわからなかったんですが、上記エントリのnon_blocking_connect()の実装を見るとPHP4には接続時にソケットに対して非同期接続を指定する方法が標準では用意されていないということなんですね。この例ではソケットをノンブロッキングモード*1にしてから接続して、接続中*2というエラーを無視するようにしているみたいで、なかなかトリッキーなコードになっています。

ちょっと作ってみた

とりあえずこの仕組みをうまく使うと外部サイトにたくさんコネクションを張る必要があるNucleusプラグインはかなり高速化できそうです。ということで、AsyncHTTP.phpという共用ライブラリを作ってNP_MetaTagとNP_SendPingに組み込んでみましたがなかなかの成績でした。特にNP_SendPingは反応の遅いサーバがあるときに、そのサーバに足を引っ張られることなく待ち時間に違うサーバの処理をしてくれるのでかなり効果が見られるようです。

確かRSSかなんかを引っ張ってくるプラグインがあったと思うけど、このあたりには劇的に効きそうだなぁ。どういう風に展開しようかな。。。。。

  • *1: socket_set_nonblock()
  • *2: Errno:115/Operation now in progress

トラックバックについて
Trackback URL:
お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/2200
Trackbacks
このエントリにトラックバックはありません
Comments
愛のあるツッコミをお気軽にどうぞ。[policy]
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
h-shizuki [Hatena] (2007/10/25 23:04) <%HatenaAuth()%>

はてな認証初体験w

Nucleus3.31に向けて、NP_Pingを改造しようと思ったんですが、AsyncHTTP.phpの使い方がよく解らなかったんで、よかったら組み込み済みのNP_SendPingのコード見せてもらいたいです

ちょっとだけ、『注意: この拡張モジュールは » PECL レポジトリに移動されており、以下のバージョン以降 PHP にバンドルされなくなっています。 PHP 5.3.0.』の記述も気になったりしてますが…

hsur (2007/10/26 02:22) <%HatenaAuth()%>

あ、了解です。
とりあえずメールでお送りしますね。

ちなみにAsyncHTTPは非同期が使えない場合には同期通信に勝手に切り替わるようにしていますが、PHP5のときと4のときで呼び出す関数は変えたほうがいいかもしれませんね。

Comments Form

コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。

OpenID を使ってログインすることができます。

Identity URL: Yahoo! JAPAN IDでログイン