Fatal Error: Unexpected BLOG

主に自分用の備忘録として

【EC-CUBE】複数の商品を大量に購入すると、購入データが途切れる現象

複数の商品を大量にカートに入れると、その後の購入フローや管理画面から注文データを確認した際に、配送情報や送料などのデータが消失してしまう事象がありました。
危うくハマりかけていたところ、弊社のウィザードから天の声を頂きましたので、忘れないようにメモ。

環境は以下の通り

以下のサイトを参考にさせて頂きました。

発生した事象

一般的に通常想定しうる商品数で購入すると正常に動作し、データも完全な状態で保存されていましたが、
以下のような場合にデータが一部消失するという事象が発生しました。

  • 複数の商品をカートへ保存(個数ではなく、商品IDが複数ということ)
  • それぞれの商品データ(商品名や説明文など)がそこそこの長さを持っている
  • 注文者情報や配送先情報も比較的長め

実際にデータの消失を確認出来たものは、送料、配送先情報(名前、住所など全て)です。

解決方法

テーブルのカラムのデータ型を修正することで解決出来ました。

ALTER TABLE dtb_order_temp MODIFY session LONGTEXT DEFAULT NULL;
ALTER TABLE dtb_session MODIFY sess_data LONGTEXT DEFAULT NULL;

デフォルトではTEXT型になっているので、これをLONGTEXT型に変更します。
dtb_sessionの方についてはもしかしたら必要ないかもしれません。

原因

注文情報を一時的に保存するためのdtb_order_tempテーブルには、セッション情報をJSONの状態で保存するフィールドがあり、
TEXT型で定義されています。
TEXT型の最大長は65,535バイトとのことですが、この上限を超えるデータを登録しようとすると、切り詰められて登録されます。
大抵の場合はこの最大長に収まるようですが、超えた場合に不完全な状態のJSONが保存され、以降の処理で参照されることになります。
今回確認した事象では、送料や配送先情報の部分が切り詰められてしまっていたということでしょう。

おわり

LONGTEXT型に変更後は、同様の注文内容でも問題なく処理できていました。
ただ、LONGTEXT型は最大長が4,294,967,295(約4G)バイトとのことなので、これはさすがに大げさかもしれません。。。
ちなみに、一段階小さいMEDIUMTEXT型は最大長16,777,215(約16M)バイトだそうで、こちらで十分かもしれませんね。