[PHP-users 4981] Re: 時間が掛かるページを実行中に、不正終了してしまう。

Youichi Iwakiri php-users@php.gr.jp
Fri, 25 Jan 2002 15:22:31 +0900


いわきりです

既に解決されてるようですが、

mots wrote in <005401c1a4c3$899c89c0$030aa8c0@kiyama.or.jp>:
 >//4桁の英数字のすべての組み合わせ(36の4乗)をDB(PostgreSQL)に登録する
 >。
 >// a_tblのran_id(text型)に挿入。
 >//データベース接続済み
 > for ($i=1;$i<1679617;$i++) {
 >  $b = sprintf ("%04s", base_convert($i,10,36));
 >  $sqlstr = "insert into a_tbl(ran_id) values ('".$b."')";
 >  $rtn = pg_exec($con,$sqlstr);
 > }
 >---------

この様に時間のかかるスクリプトをブラウザからのリクエストにより
実行する必要性がないのであればコマンドライン版で実行したほうが
良くないですか? ブラウザのタイムアウトも気にしないで済みますし。

私の所の非力なマシンで計測すると
> time php -q -d max_execution_time=0 test0.php
296.726u 108.204s 32:24.97 20.8%	1096+741k 0+0io 0pf+0w

32分強かかりました。

ご参考までに、pg_put_line(), pg_end_copy()を使うと大幅に
時間短縮できます。
<?php
 $con = pg_connect("dbname=iwakiri");
 pg_exec($con, 'drop table a_tbl');
 pg_exec($con, 'create table a_tbl (ran_id text)');

 pg_exec($con, 'copy a_tbl from stdin');
 for ($i=0;$i<81;$i++) {
  for ($j=1;$j<20737;$j++) {
   $b = sprintf ("%04s", base_convert($i*20736+$j,10,36));
   pg_put_line($con, "$b\n");
  }
  echo "$i\n";
 }
 pg_put_line($con, "\\.\n");
 pg_end_copy($con);
 pg_close($con);
?>
これだと、
> time php -q -d max_execution_time=0 test1.php
121.231u 0.249s 5:47.06 34.9%	1191+817k 23+0io 40pf+0w

6分弱で167万件のデータを挿入できます。

4.2.0-devのpgsql拡張モジュールだとこんな書き方も可能です。
<?php
 $con = pg_connect('dbname=iwakiri');
 pg_exec($con, 'drop table a_tbl');
 pg_exec($con, 'create table a_tbl (ran_id text)');

 for ($i=0;$i<81;$i++) {
  $b = array();
  for ($j=1;$j<20737;$j++) {
   $b[] = sprintf ("%04s", base_convert($i*20736+$j,10,36));
  }
  pg_copy_from($con, 'a_tbl', $b);
  echo "$i\n";
 }
 pg_close($con);
?>
こちらだと、
> time php -q -d max_execution_time=0 test2.php
109.102u 0.367s 5:30.59 33.1%	1112+4542k 27+0io 41pf+0w

です。