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