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