[PHP-users 31632] PDOException: General error: 7 server closed the connection について
joich_cassius @ yahoo.co.jp
joich_cassius @ yahoo.co.jp
2007年 3月 8日 (木) 01:51:33 JST
はじめまして樫明日と申します。
初めての投稿になります。どうぞ宜しくお願い申し上げます。
PHPについてはあまりくわしくありません…。
自分なりに調べてみたのですが、なかなか解決できず困っております。
もし同じような現象に出くわしたことがありましたらお教え願えます
でしょうか?
■環境
PHP5.2.1
PostgreSQL8.1.6
CentOS4.4
Apache2.2.3
メモリ1.5GB
■プログラムの内容
上記の環境でWebアプリケーションを構築。
1.ブラウザより5〜10MD程度のCSVファイルをアップロード
しディレクトリに格納。
2.バッチ処理でPHP(CLI)のプログラムを実行しアップし
たCSVファイルの中身をデータベース(PostgreSQL)に
格納します。CSVファイルは1万件程度の行数です。
以下上記2のプログラムの登録部分の大まかな内容です。
-----------------------------------
$pdoDbh = new PDO( $dsn,
$userName,
$dbName,
array(PDO::ATTR_PERSISTENT => true) );
while ($line = fgets( $impFp, 10000 )){
// $lineをパース
try{
$pdoDbh->beginTransaction();
$sql = "lock table ".$tableA." in EXCLUSIVE ";
$pdoDbh()->prepare($sql);
$stmt->execute();
$sql = "lock table ".$tableB." in EXCLUSIVE ";
$pdoDbh()->prepare($sql);
$stmt->execute();
---------------------------------------------
500文字程度のテキストデータを
PDOを利用してPostgreSQLにデータを登録(insert)する処理
SQLは簡略化して書かせていただいております。
$sql = "insert into $tableA (uid, mailaddr) values (:uid, :mailaddr);
$stmt=$pdoDbh->prepare($sql,array(PDO::PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT=>false)
);
$stmt->bindParam(':uid', $uid);
$stmt->bindParam(':mailaddr', $mailaddr);
$stmt->execute();
500文字程度のテキストデータをinsertと同様
PDOを利用してPostgreSQLにデータを更新(update)する処理
SQLは簡略化して書かせていただいております。
$sql = "update $tableB set uid=:uid, status=:status where .....;
$stmt=$pdoDbh->prepare($sql);
$stmt->bindParam(':uid', $uid);
$stmt->bindParam(':status', $status);
$stmt->execute();
---------------------------------------------
$pdoDbh->commit();
} catch(PDOException $e){
print $e->toString();
}
}
■現象
プログラム2を実行するとしばらくの間はSQLは実行され続
けます。
2〜3分経過すると例外(PDOException)が発生します。
※3000件程度だと例外は発生せず、最後までプログラムは
正常に実行完了します。
PSDOExceptionの内容は以下の通りです。
exception 'PDOException' with message 'SQLSTATE[HY000]:
General error: 7 server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.'
上記のエラーを調査してみたのですが、同じようなエラーに関する
情報を探し出すことができませんでした。
エラーが関数をプログラムの開始部分に記述しましたが問題は解決され
ませんでした。
ini_set("memory_limit", "-1");
ini_set("max_execut- ion_time","-1");
php.iniでPostgreSQL関連のパラメータは以下の通りに設定してお
ります。
[PostgresSQL]
pgsql.allow_persistent = On
pgsql.auto_reset_persistent = On
pgsql.max_persistent = -1
pgsql.max_links = -1
pgsql.ignore_notice = 0
pgsql.log_notice = 0
何らかの解決方法、あるいはヒントがいただけたら幸いでございます。
よろしくお願い申し上げます。
----------------------------------------------------------------------
参考に以下の情報を記しておきます。
----------------------------------------------------------------------
■エラーが発生したときのvmstatの状態
# vmstat 2 10000
procs -----------memory---------- ---swap-- -----io---- --system--
----cpu----
r b swpd free buff cache si so bi bo in cs us sy id
wa
0 0 24972 56728 122584 1231028 0 0 0 0 1003 23 0 0
100 0
0 1 24972 45504 122584 1231344 0 0 0 836 1098 1332 17 3
60 21
←開始
0 1 24972 45376 122584 1231428 0 0 0 2278 1256 5140 36 6
0 59
2 0 24972 45248 122584 1231512 0 0 0 2398 1273 5325 36 7
0 58
1 0 24972 45120 122584 1231556 0 0 0 2444 1282 5421 36 7
0 57
0 1 24972 44992 122584 1231632 0 0 0 2440 1278 5510 38 6
1 56
1 0 24972 44864 122584 1231700 0 0 0 2464 1283 5684 38 8
0 55
0 1 24972 44736 122584 1231776 0 0 0 2772 1321 5945 41 7
0 53
大体1〜2分程度
1 0 24972 34504 122628 1237980 0 0 0 2536 1308 5436 38 6
0 57
0 1 24972 34376 122632 1238056 0 0 0 2662 1324 5549 39 6
0 56
1 0 24972 34248 122632 1238140 0 0 0 2668 1327 5661 40 6
0 53
1 1 24972 34120 122632 1238216 0 0 0 2656 1328 5461 38 8
0 55
0 1 24972 33928 122632 1238292 0 0 0 2510 1305 5256 36 7
0 58
0 1 24972 33800 122636 1238364 0 0 0 2736 1340 5767 40 7
0 53
1 0 24972 33672 122636 1238440 0 0 0 2448 1303 5125 36 6
0 58
0 1 24972 50376 122640 1238416 0 0 0 8034 1533 3494 33 9
1 58
←この辺でexception発生
0 1 24972 50264 122640 1238420 0 0 0 10266 1839 49 9 5
0 87
0 0 24972 50328 122640 1238384 0 0 0 7430 1659 119 2 3
16 78
0 0 24972 50336 122640 1238384 0 0 0 0 1004 27 0 0
100 0
0 0 24972 50336 122640 1238384 0 0 0 0 1004 22 0 0
100 0
■sar でcpuの利用率を確認
# sar 1 10000
23時49分44秒 CPU %user %nice %system %iowait %idle
23時49分28秒 all 0.00 0.00 0.00 0.00 100.00
23時49分29秒 all 0.00 0.00 0.00 0.00 100.00
23時49分30秒 all 38.61 0.00 7.92 42.57 10.89
←開始
23時49分31秒 all 37.00 0.00 5.00 58.00 0.00
23時49分32秒 all 33.66 0.00 6.93 59.41 0.00
23時49分33秒 all 36.36 0.00 5.05 58.59 0.00
大体1〜2分程度
23時52分10秒 all 39.60 0.00 6.93 52.48 0.99
23時52分11秒 all 45.00 0.00 10.00 45.00 0.00
23時52分12秒 all 45.54 0.00 9.90 44.55 0.00
23時52分13秒 all 34.34 0.00 16.16 49.49 0.00
23時52分14秒 all 10.89 0.00 6.93 81.19 0.99
23時52分15秒 all 1.00 0.00 2.00 97.00 0.00
←この辺でexception発生
23時52分16秒 all 0.00 0.00 1.00 57.00 42.00
23時52分17秒 all 0.00 0.00 0.00 0.00 100.00
23時52分18秒 all 0.00 0.00 0.00 0.00 100.00
23時52分19秒 all 0.00 0.00 0.00 0.00 100.00
23時52分20秒 all 0.00 0.00 0.00 0.00 100.00
■例外発生時のPostgreSQLのログには以下のように書き出されています。
2007-03-07 23:13:11 JST LOG: server process (PID 29678) exited with exit
code 255
2007-03-07 23:13:11 JST LOG: terminating any other active server processes
2007-03-07 23:13:11 JST LOG: all server processes terminated;
reinitializing
2007-03-07 23:13:11 JST LOG: database system was interrupted at 2007-03-07
23:11:57 JST
2007-03-07 23:13:11 JST LOG: checkpoint record is at 0/1EA85F18
2007-03-07 23:13:11 JST LOG: redo record is at 0/1EA85F18; undo record is
at 0/0; shutdown FALSE
2007-03-07 23:13:11 JST LOG: next transaction ID: 1938873; next OID: 91064
2007-03-07 23:13:11 JST LOG: next MultiXactId: 1; next MultiXactOffset: 0
2007-03-07 23:13:11 JST LOG: database system was not properly shut down;
automatic recovery in progress
2007-03-07 23:13:11 JST LOG: redo starts at 0/1EA85F5C
2007-03-07 23:13:14 JST LOG: record with zero length at 0/20CD950C
2007-03-07 23:13:14 JST LOG: redo done at 0/20CD94E4
2007-03-07 23:13:16 JST LOG: database system is ready
なおPostgreSQL(postgresql.conf)はほぼデフォルトの状態で利用しています。
※ログの出力フォーマットのパラメータのみ変更
--------------------------------------
Start Yahoo! Auction now! Check out the cool campaign
http://pr.mail.yahoo.co.jp/auction/
PHP-users メーリングリストの案内