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