- blogs:
- cles::blog

続・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かなんかを引っ張ってくるプラグインがあったと思うけど、このあたりには劇的に効きそうだなぁ。どういう風に展開しようかな。。。。。
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/2200
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
はてな認証初体験w
Nucleus3.31に向けて、NP_Pingを改造しようと思ったんですが、AsyncHTTP.phpの使い方がよく解らなかったんで、よかったら組み込み済みのNP_SendPingのコード見せてもらいたいです
ちょっとだけ、『注意: この拡張モジュールは » PECL レポジトリに移動されており、以下のバージョン以降 PHP にバンドルされなくなっています。 PHP 5.3.0.』の記述も気になったりしてますが…
あ、了解です。
とりあえずメールでお送りしますね。
ちなみにAsyncHTTPは非同期が使えない場合には同期通信に勝手に切り替わるようにしていますが、PHP5のときと4のときで呼び出す関数は変えたほうがいいかもしれませんね。
コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。
OpenID を使ってログインすることができます。
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(112971)
3 . 年次の人間ドックへ(112395)
4 . 2023 年分の確定申告完了!(1つめ)(111962)
5 . 三菱鉛筆がラミーを買収(111835)