[PHP-users 21679]Re: pg_field_typeでタイムアウト

komura komura @ ma9.seikyou.ne.jp
2004年 5月 15日 (土) 18:34:15 JST


komura です。

On Sat, 15 May 2004 15:48:34 +0900
坂本 光弘 <msakamoto @ ybm.jp> wrote:

> 私なりに原因を調べてみたところ「pg_field_type」関数部分で異常に処理時
> 間がかっているようです。検証方法としては、以下のソースの
> 「pg_field_type」に関するところをばっさりコメントアウトして確認してみ
> ました。
> また、「pg_field_type」がきちんと想定した内容で返ってきていない場合も
> あるようです。
> どなたか、レコード数が多くても「pg_field_type」を問題なく動作させる方
> 法ご存知の方いらっしゃいませんか?

pg_field_type() は PHP の内部で pg_connect() の結果の接続を使用しています。
このため、pg_close() で先に pg_connect() で取得した接続を閉じてしまうと
うまく結果を取得することができなくなります。

pg_close() は pg_connect() で接続を開いた場合、スクリプト終了後、自動的に
接続を閉じますので、通常は呼び出す必要はないということが PHP マニュアルに
書かれています。

http://jp.php.net/manual/ja/function.pg-close.php


接続を閉じないと気持ち悪いのであれば、関数( 今回は GetShowPGData() )の
最後で呼び出すようにすれば動作すると思います。

> //
> //与えられたクエリーを表示する。
> //
> function GetShowPGData($sql){
> //	レコードセットを得る
> 	$con = pg_connect("dbname=weblog user=pgsql");
> 	if ($con == false) {
> 		printf("データベースには接続できませんでした。理由: %s<br>\n",$php_errormsg);
> 		exit;
> 	}
> 	
> //クエリーの実行
> 	$res = pg_query($con, $sql);	
> 	if ($res == false){
> 		printf("クエリー失敗。理由: %s<br>\n",pg_errormessage($con));
> 		exit;
> 	}

以下の pg_close() を削除

> //データベースのクローズ
> 	pg_close($con);

> //フィールド名を表示
> 	//レコードセットの行数を得る
> 	$rowcnt = pg_numrows($res);
> 	print "<table border>\n";
> 	
> 	//レコードセットの行数分ループする
> 	for ($row_num=0; $row_num<$rowcnt; $row_num++){
> 		print "<tr>\n";
> 		if ($row_num == 0) {
> 		//最初だけフィールド名を表示
> 			$colcnt = pg_num_fields($res);
> 			print "<th>順位</th>";
> 			for ($col_num=0;$col_num<$colcnt;$col_num++) {
> 				print "<th>" . pg_field_name($res,$col_num) . "</th>";
> 			}
> 			print "</tr>\n<tr>\n";
> 		}
> 		
>         //レコードを表示
> 		$rec = pg_fetch_array($res, $row_num, PGSQL_NUM);
> 		$jyunni = $row_num + 1;
> 		print "<td align=\"right\">$jyunni</td>";
> 
> 		for ($col_num=0; $col_num<$colcnt; $col_num++) {
> 			if ($rec[$col_num] == null){
> 				$rec[$col_num]=" ";
> 			}
> 
> 			switch (pg_field_type($res,$col_num)){

... 省略 ...

> 			}
> 		}
> 		print "</tr>\n";
> 	}
> 	print "</table>\n";

必要であれば、ここで接続を閉じる

//データベースのクローズ
pg_close($con);

> }


-- 
komura <komura @ ma9.seikyou.ne.jp>


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