EC-CUBE2系で商品を大量にカートに入れると注文情報が抜けたりカートが消えたりする

EC-CUBE2系でMySQLを使用しているシステムでは、カートに数十個を超えるような沢山の商品を入れると、カートの情報が消えたりします。
また少し多い数の商品をカートに入れて注文するだけでも、受注メールが送信されるにもかかわらず、送料計算ができなくなったり管理画面で受注データが見れないなどの障害が発生します。

EC-CUBE2では、セッション情報をDBに保存していますが、セッションの格納されるカラムの最大サイズをオーバーしてデータが欠損するためです。

セッションの格納されるカラムの型はtext型で、MySQLのtext型の最大文字数は65,535バイトです。

カートに商品を入れると、カートに入れた商品の情報がセッションに保存されます。
カートに入れる商品数が多く、DBに保存しきれなくなると、まずセッション情報の入りきれない部分が欠落した状態でDBに保存され、その後セッション情報が消えるためカート情報が消えます。

注文画面では、カートの商品情報に加え、送料を計算するための商品詳細情報と注文情報が含まれるため、カートよりもデータ欠損するまでの商品数が少なくなります。
また注文情報はカート情報の後に追記され、セッション情報が消えるときは末尾から消えるため、注文関連の情報が欠損しやすくなります。

PostgreSQLでは、text型の最大長は1GBのためこの障害はあまり発生しません。

解決方法

この障害を回避する対策は、セッションの格納されるカラムをtext型からサイズの大きいmediumtext型やlongtext型にします。

セッション情報が格納されるカラムは、セッションデータテーブルのdtb_sessionだけでなく注文一時情報テーブルのdtb_order_tempにもあります。

alter table dtb_session modify sess_data mediumtext;
alter table dtb_order_temp modify session mediumtext;

MySQLのtext型

サイズ
TINYTEXT最長255 バイト
TEXT最長65,535 バイト(64KB)
MEDIUMTEXT最長16,777,215 バイト(約1.6MB)
LONGTEXT最長4,294,967,295 バイト(約4.3GB)

EC-CUBE2のセッションの扱いは、排他処理がされていないなど様々な問題があります。
またEC-CUBEはPostgreSQLを主にして作成されているようで、MySQLで無改造で使用するにはインデックスの考慮が足りなかったりしてサイト規模が大きいとトラブルが発生しやすくなります。

関連記事

スポンサーリンク

borderRight

ホームページ製作・web系アプリ系の製作案件募集中です。

上に戻る