[PHP-users 21674]pg_field_typeでタイムアウト

坂本 光弘 msakamoto @ ybm.jp
2004年 5月 15日 (土) 15:48:34 JST


はじめまして
さかもとと申します。

ところで、現在以下の環境でphpとPostgreSQLを使ったプログラムを組んでい
るのですが、SQL分を引数に与えるだけでするだけでとりあえず表として表示
可能なユーザー関数を作ってみました。ところが、結果のレコード数が少ない
ときには問題ないのですが、レコード数が多いと途中で

Fatal error: Maximum execution time of 2147483647 
seconds exceeded

というエラーが発生します。

環境
FreeBSD 4.9
php4-4.3.6_1
apache-2.0.49
postgresql-7.4.2

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


//
//与えられたクエリーを表示する。
//
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($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)){
			case "int2": 
				print "<td align=\"right\">".number_format($rec[$col_num], 0, '.', ',')."</td>";
				break;
				
			case "int4": 
				print "<td align=\"right\">".number_format($rec[$col_num], 0, '.', ',')."</td>";
				break;
				
			case "int8": 
				print "<td align=\"right\">".number_format($rec[$col_num], 0, '.', ',')."</td>";
				break;
				
			case "numeric": 
				print "<td align=\"right\">".number_format($rec[$col_num], 0, '.', ',')."</td>";
				break;
				
			case "float4": 
				print "<td align=\"right\">".number_format($rec[$col_num], 0, '.', ',')."</td>";
				break;
				
			case "float8": 
				print "<td align=\"right\">".number_format($rec[$col_num], 0, '.', ',')."</td>";
				break;
				
			case "money": 
				print "<td align=\"right\">".number_format($rec[$col_num], 0, '.', ',')."</td>";
				break;
				
			case "varchar": 
				print "<td>{$rec[$col_num]}</td>";
				break;
				
			case "bpchar":	
				print "<td>{$rec[$col_num]}</td>";
				break;

			case "bool":	
				print "<td>{$rec[$col_num]}</td>";
				break;

			case "timestamp":	
				print "<td>{$rec[$col_num]}</td>";
				break;

			case "date":	
				print "<td>{$rec[$col_num]}</td>";
				break;

			case "time":	
				print "<td>{$rec[$col_num]}</td>";
				break;

			case "inet":	
				print "<td>{$rec[$col_num]}</td>";
				break;

			default:
				print "<td>{$rec[$col_num]}</td>";
				break;
			}
		}
		print "</tr>\n";
	}
	print "</table>\n";
}

--------------------
さかもと
mail:msakamoto @ ybm.jp
--------------------


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