[PHP-users 27216] Re: ブラウザのタイムアウトを回避できません
Shu Sawada
luna @ lunanet.gr.jp
2005年 10月 14日 (金) 01:23:11 JST
さわだです。
ところで、最初に例示されたコードでは500件ごとの処理になっていない気が
するのですが。
----
foreach ($table as $name)
{
//ファイル作成処理は省略
$sql = "SELECT * FROM " . $name; //実行クエリ。全件取得
$err = "backup_001_" . $name; //?
$rs = do_sql($sql, $err); //クエリ実行と思う
$rs_cnt = pg_numrows($rs); //全件の行数
$fld_cnt = pg_numfields($rs); //テーブルのフィールド数
// 500件処理毎にブラウザに*印表示
for($r=0; $r<$rs_cnt; $r++) //ここ何か処理してます?
{ //printしか実行しない?
if (($r % 500) == 0)
{
print "*";// この状態で突然ストップ
if (($r != 0) and (($r % 50000) == 0))
print "<br>";
}
}
//ファイルへの書き出し処理も省略
}
----
ということで、forループは物凄い勢いでカウントアップしつつ、たまーに
print文を実行するしか機能していないように見えます。
テーブルからのデータ全件取得時間(explain analyze) + postmaster
からphpへのデータ転送時間がとても長かったりしませんか?
で、ここから先は蛇足です。
仮にそういう問題なら、primary keyでソートして、limitとか付けて抽出、
ループすれば宜しいのではないでしょうか。
というか、例示されたコードだと、いずれにせよデータが増えるとタイムアウト
する可能性がある気がします。
ということで、テキトーにこさえたもので汚いですが、雰囲気だけ
----
ob_end_flush();
$fp = fopen("./test.dat", "w");
for( $i=0 ; $i < 10 ; $i++ )
{
//プライマリキーでソートして、5件ずつ処理する。
if( $i === 0 )
$sql = "select * from {table} order by uid limit 5";
else
{
$sql = "select * from {table}";
$sql.= "where uid > $this_id order by uid limit 5";
}
$result = pg_query($con, $sql);
//5件分を書き出す
for( $j=0 ; $j < pg_num_rows($result) ; $j++ )
{
$tmp = pg_fetch_array($result, $j, PGSQL_ASSOC);
foreach( $tmp as $key => $value )
fwrite($fp, $value . "\t");
fwrite($fp, "\n");
}
//最後まで行ってれば終了
if( $j != 5 )
break;
//つぎはこれより先のヤツを5件取れば宜しい。
$this_id = pg_fetch_result($result, 4, "item_id");
//ブラウザの機嫌取り。
print "$this_id までおわり。<BR>";
print str_repeat(" ", 256);
flush();
}
print "ぜんぶおわり。<BR>";
----
みたいな感じとかにしないと、件数ごとの処理にならない気がします。
こんなコードじゃ使えないですが、そこら辺は適当に。
#phpPgAdminとかって選択肢は無いんですか?
#http://phppgadmin.sourceforge.net/
----
Shu Sawada
http://luna.lunanet.gr.jp/
PHP-users メーリングリストの案内