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

神 谷 djr_kamiya @ hotmail.com
2007年 2月 2日 (金) 16:07:43 JST


こんにちは
神谷です

WindowsXP上で
php5.1.2
PostgreSQL8.1.4
を使用しています。

サンプルのようなコードで確認したのですが、sleep()及びusleep()を使用
するとpg_connection_busy()がfalseになるまでの時間が延びます。
SQL的には、約18万件の結果を取得するSQLです。(全体は約20万件)
今は長時間動作するSQLの確認をしているため、ほぼ全件のデータを取
得しているだけなので、そこは突っ込まないで欲しいのですが。

psqlのコマンドラインで実行した場合には4.6秒程
systemコマンドでpingを使ったsleep紛いのインターバルを使用した場合は18秒程

で結果が返ってくるのですが、sleep()、usleep()を使用してイン
ターバルした際には388秒(6分28秒)もかかってしまう等の状況になって
しまいます。
DBをシャットダウンしないで計測しているので、DBのキャッシュが利用され
ている状態の時間で、都度DBをシャットダウンすると、更に時間がかかる
事も確認しています。

予想される原因は、非同期クエリpg_send_query()の動作に、sleep()、
usleep()が影響して止まっているくらいしか、想像がつきません。
個人的な理想としては、sleep関数は非同期クエリに影響しないことを
望んでおり、CPUリソースを消費しないようにするには、そうあるべきでは
ないかと思っています。

原因が私の予想とは別のところにあるのかもしれませんが、もし私の予
想通りだとしたとき現在の動作が
・PHPの仕様として適切
・現在の動作仕様上避けられない
・機能実装上のミス
のどれにあたるのか、ご存知ないでしょうか?

<?php
/* DB接続 */
$ConStr  = "host="     . DB_HOST;
$ConStr .= " port="     . DB_PORT;
$ConStr .= " dbname="   . DB_NAME;
$ConStr .= " user="     . DB_USER;
$ConStr .= " password=" . DB_PASS;
$DBCon   = pg_connect( $ConStr );

/* 現在時刻の取得 */
$QueryExecutionStartTime = time();

/* SQLの実行 */
$SQL = "select * from hoge_table";
pg_send_query( $DBCon, $SQL );
$QueryExecutionTime = time() - $QueryExecutionStartTime;

/* 実行中であればループ */
while( pg_connection_busy( $l_DBCon ) === TRUE ) {
  $QueryExecutionTime = time() - $QueryExecutionStartTime; // 動作時間(秒)
を求める
  if ( $QueryExecutionTime > 2 ) { // 実行してから約1秒経ったらインターバル
を挟む
//    usleep( 1000000 ); // インターバル処理
//    sleep( 1 ); // インターバル処理
    system("ping localhost -n 2 > null"); // インターバル処理
}
print $QueryExecutionTime;
?>

_________________________________________________________________
Hotmail に直接アクセス!MSN がさらに使いやすく http://jp.msn.com/ 



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