このエントリーをはてなブックマークに追加 Twitterでツイート EC-CUBEの郵便番号DB登録

EC-CUBEでは、会員登録や住所変更の際に郵便番号から住所を入力する「住所自動入力」機能が備わっているのですが、この機能を有効にするためには管理者画面の「基本情報管理」にある「郵便番号DB登録」を行う必要があります。開発環境ではこれを行っていなかったので、試してみたところ、なかなか完了しません^^;
何度かトライするたびに登録件数は増えていくのですが、なかなか終わる気配がないので、ソースコードを眺めてみました。

対象のソースコードは、/data/class/pages/basis/LC_Page_Admin_Basis_ZipInstall.phpです。その中のprocessメソッドでは、CSVファイルを1行ずつ読み込んで、毎回テーブルに挿入していました。開発環境のデータベースはMySQLで、自動コミットモードになっているので、1行ずつコミットしていたのでは時間がかかるのも納得がいきます。

そこでとりあえず、while文の前後でトランザクションの設定を追加(赤字部分)してみました。

$objQuery->begin();
while (!feof($fp)) {
	$arrCSV = fgetcsv($fp, ZIP_CSV_LINE_MAX);

// 途中省略

}
$objQuery->commit();

これで試してみると、コミットする前にタイムアウトになってしまい(開発環境ではタイムアウトを10分に設定)、データを登録できませんでしたorz
仕方ないので、1,000件数に一回まとめて処理するように修正(青字部分を追加)して、もう一度トライ。

$objQuery->begin();
while (!feof($fp)) {
	$arrCSV = fgetcsv($fp, ZIP_CSV_LINE_MAX);

	// すでに書き込まれたデータを飛ばす。
	if($cnt > $end_cnt) {

// 途中省略

		$objQuery->insert("mtb_zip", $sqlval);
		if ( ( $cnt % 1000 ) == 0 ) {
			$objQuery->commit();
			$objQuery->begin();
		}
	}

// 途中省略

}
$objQuery->commit();

これだと、約2/3程度進んだところでタイムアウト。最初に比べればだいぶましになりましたね。残りのために、もう一度「郵便番号DB登録」を実行。これで、ようやく全部のデータを登録でき、住所自動入力ができるようになりました。

まとめて処理する件数は、大きすぎるとタイムアウト時にコミットできずにロスする件数が大きくなってしまいますし、少ないとコミットする回数が多くなってしまい効率が落ちてしまいます。
とりあえずは1,000件で試しましたが、もっとよい件数があるんでしょうね^^;

投稿日:2009年11月19日
  • ※コメントは、スパム対策などのためIPアドレスにて制限しております。
  • ※誹謗や中傷、スパムなど、不適切な内容は公開いたしません。ご了承ください。