[PHP-users 31454] Re: これは仕様?(sleep関数と非同期クエリ関数の関係)

kamiya d djr_kamiya @ hotmail.com
2007年 2月 13日 (火) 17:57:07 JST


神谷です。

花原さん、レスありがとうございます。

>もうちょっと真剣に(でもやはり斜め読み ^_^;)、PHPのpgsqlや、PostgreSQLの
>libpqのソースコードを見ました。
お時間を割いていただき、ありがとうございます。
私もチョットソースは見たのですが、cの開発経験が皆無に近い状態なのでソース
を読んでも頭に入ってこなくて、理解にも至りませんでした。
PQexec()あたりでqueryを実行してるくらいは読めたのですが、
pg_connection_busy()
内のphp_pgsql_do_async()あたりで良くわからない状態でしたので。

>pg_send_query()、pg_connection_busy()、pg_get_result()の非同期クエリ系の
>場合、マルチスレッドで並行実行しているわけではありません。単に関数呼び出
>しがブロックしてしまわないようになっているだけで、本質的にはシングルスレッ
>ドで、内部的にポーリングしてます(シングルスレッドだから仕方がない)。
本質はここなのですね。
そうなると、現状のphpの動作仕様上の制限と考えたほうが良さそうですね。

>usleep(1000)だと、頻繁にpg_*()関数に実行の機会を与えますが、
>usleep(2000000)だと、2秒に一回しかその機会を与えないからではないでしょう
>か?
そのとおりではないかと私も想定しています。
しかし、それだけの理由であればWindowsのpingを発行してsleep()を代用した
場合は、最善のレスポンスが得られるのではないかとおもったのですが、そこが
違っているため、他にも理由はあるかもしれませんね。

># usleep(1000); は、usleep(10000); の10msぐらいでも対して変わらない
># 気がするけどどうですか? OSのスケジューラーのタイムクオンタムが
># 10msぐらいなので(根拠なし)。
確認してみましたが、仰るとおり変わりませんでした。
cpu性能に依存しないのでしょうか?

>     http://jp.php.net/manual/ja/function.usleep.php
>
>の User Contributed Notes のところに、socket_select() を使った、
usleep_win()
>というのがありますが、たぶん、変わらないとは思うんだけど、やってみる価値
>はあるかも。
User Contributed Notesには、このようなサンプルもあるんですね。
見落としていました。
とりあえず、どうなるかだけ試してみたのですが、使用するとApacheプロセスがお亡
くなりに
なってしまいます。
Apacheの1.3.37とphp_sockets.dllの関係にに何らかの問題があるのかもしれません
ね。
(firewallの設定は切っているのでSocketのopenに失敗しているとかでは無さそう)


とりあえず今回はsleep関数の使用をあきらめようかと思います。
ありがとうございました。

_________________________________________________________________
北海道から沖縄まで選りすぐりのラーメン1000杯が大集合 
http://promotion.live.jp/searchmap/ 



PHP-users メーリングリストの案内