[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 メーリングリストの案内