PHPのstream_set_blocking

PHP_Forkの続き。

PHPにもstream_set_blocking という関数があり、それを使えば非同期処理が行えるみたいなので、やってみる。

[php]<?php $urls = array( 'http://search.yahooapis.com/VideoSearchService/V1/videoSearch?appid=YahooDemo&query=Pearl+Jam&output=json', 'http://search.yahooapis.com/ImageSearchService/V1/imageSearch?appid=YahooDemo&query=Pearl+Jam&output=json', 'http://search.yahooapis.com/AudioSearchService/V1/artistSearch?appid=YahooDemo&artist=Pearl+Jam&output=json', );

$fps = array(); $w = $e = NULL;

foreach ($urls as $row) { $fp = fopen($row, 'rb'); stream_set_blocking($fp, 0); $fps = $fp; }

$outs = array(); while(TRUE) { $r = $fps; $w = $e = NULL; $res = stream_select($r, $w, $e, NULL); if ($res === FALSE) { break; } foreach ($r as $fp) { $outs = stream_get_contents($fp); $fps = array_diff($fps, array($fp)); fclose($fp); } if (empty($fps)) { break; } }

print_r($outs); [/php]
で、fopen に 'http://~' というストリームを使用している為か、
fopen の時点で止まってしまう(非同期にならない)のだね。
ってか、http ストリームについてはそもそも非同期対応してないんじゃないの、とか。

stream_set_blocking

注意: PHP 4.3 より前のバージョンでは、この関数は ソケットべースのストリームにしか機能しませんでした。 PHP 4.3 より、この関数は、非ブロックモードを サポートするすべてのストリームにおいて利用可能となりました。 (現在サポートするのは、通常のファイルストリームとソケットストリームのみです。)


HTTPプロトコルレベルでの接続が確立されるってことは、
そのままデータを読み込めることも意味するわけでどのみち意味ないしね。

もしかすると、もっと低レベルレイヤのアクセスにしておけば、
接続を確立する部分から非同期にできるかもしれないが、
PHPで素のコードを書くと煩雑になるし、であれば、素直に curl 使っておけよ、となるのかな。