実行環境
・さくらのレンタルサーバ(ビジネスプラン)
EC-CUBE:3.0.17
サーバーOS:FreeBSD 9.1
DBサーバー:MySQL 5.5.59
WEBサーバー:Apache
PHP:7.2.14 (モジュール版)
起きた現象
EC-CUBE3.0.17の仮登録を有効にしたときの会員登録の流れは、
新規会員登録フォームに必要事項を記入
↓
仮登録完了のメールが飛ぶ
↓
メール本文の本人確認用リンクをクリックすると本登録完了
↓
本登録完了のメールが飛ぶ
↓
登録したメールアドレスとパスワードでログイン可能になる
という感じになります。
今回起きたのは、上記の流れがすべてうまくいっているように見える(ログを見てもエラーは出ておらず、仮登録完了メールも本登録完了メールも届く)のに会員データのstatusフラグが仮登録のままになってしまってました。
解決策
EC-CUBEについて知見が詰まっている「EC-CUBE」開発コミュニティ掲示板にドンピシャの解決策がありました。
src/Eccube/Controller/EntryController.php
activate() 内、flush() の直後にトランザクションをcommitする処理を追加。
具体的なコードは下記を参照ください。
愛媛県のh_tanakaさん、ありがとうございます!
この問題の原因を探るために僕がやったこと
ここからは実際に僕が原因究明のために何をやったのか書きます。紆余曲折を経て、上記コミュニティのQ&Aに辿り着きました。
何が起こっているのかを明確にする
「お客様からログインできないと連絡があったので調べてほしい」と連絡が入りました。まずは、どこに問題があるのかを明確にしなければ。ということで詳しく調べる前に現状を確認・整理しました。
わかったことは、
・管理者は問題なくログインができる
・会員がマイページにログインできない(仮登録状態だから)
・管理者で管理画面から会員の登録状態を本登録に変更すると会員はマイページにログインできる
・新規会員登録をした後、本人確認メール文中のリンクをクリックすると、会員登録完了メールが届くが会員データは仮登録のままになっている
実行ログを確認する
まずは、新規登録の処理をしてみてログを確認します。
フロント部分の処理になるので、
/app/log/front_site_2019-03-02.log
をメインでチェックしました。ログを見ても何の問題もなく動いてるっぽい。
問題が再現できるか、同サーバー内に別のEC-CUBEをインストールして試す
よくわからないので、同じ問題が再現できるかテスト環境を作って試すことに。compooserでサクッと入れて、install.phpにアクセスして必要事項を入力するだけ。手軽さはWordPress並みです。
EC-CUBE3は、ほぼ初見なのでテスト環境を使って設定の変更の仕方やパスを指定する方法、動的ブロックの書き方、プラグイン導入方法などをサラッと学びました。
EC-CUBE内の本人確認処理に該当する箇所を調べる
本番と同じ条件のテスト環境でEC-CUBE3を動かしてみたのですが、会員登録処理は何の問題もなくキレイに行うことができました。実際の処理を書いている部分を詳しく見てみたくなったのでチェックしました。
src/Eccube/Controller/EntryController.phpファイルのactivate()メソッド
src/Eccube/Entity/Customer.php
src/Eccube/Entity\Master/CustomerStatus.php
src/Eccube/Repository/CustomerRepository.php
あたりを重点的にチェックしました。
activate()メソッド内で
log_info($CustomerStatus);
などと書いて変数の中身をログで確認したり。
Githubでhistoryを調べる
今回焦点になっている処理部分は、
src/Eccube/Controller/EntryController.php
です。
EC-CUBE3はgithub上で開発が進められているので、過去のソースコードもすべてチェックすることができます。
src/Eccube/Controller/EntryController.php のhistoryを全てチェックしました。
EC-CUBE2系から3系にスマートに生まれ変わっていく様子が知れて勉強になりました。
データベース構造に変更などないかチェック
本番環境は公開時にEC-CUBEバージョンが3.0.14でした。3.0.17にバージョンアップする途中でデータベース構造などに変更がないかチェックしました。特に問題は見つかりませんでした。データベース構造ってそんなに簡単に変えないよね。
テスト環境に使用しているプラグインを一つずつ入れてチェック
会員登録に関係するプラグインは一つも入っていないのですが、原因がよくわからない状態なのでダメ元で一つずつチェックしました。地道にチェックをした結果、「やっぱりプラグインは関係ない」という知見を得ました。
プラグインのバージョンをチェック
本番環境のプラグインにいくつか最新バージョン出ないものがあったので、バックアップを取って全てバージョンを最新にしました。今回の問題とは関係なかったようですが、動作も問題ないですしバージョンアップできたので良しとします。
Doctrine2について調べる
データベースの更新処理に問題がありそうとわかってきたので、EC-CUBE内のDB処理を突っこんで調べることにしました。EC-CUBE3はSymfony2というフレームワークを基にした軽量フレームワークSilexをベースにつくられています。(そのSilexは開発者が「もう、これSymfony4でよくね?」ってことで2018年6月にサポート終了になりました。その動向をキャッチしてSymfony3をベースにしたEC-CUBE4がリリースされた、という経緯があります。)
で、EC-CUBE3のDB部分はDoctrine(ドクトリン)というORマッパーが採用されています。その処理を追いたいのでササっとDoctrineについて調べました。
データベースへのUPDATE処理を書き換えてみる
Doctrine2で生のSQLを書いてみたりと試行錯誤をしてみました。このあたりで正解にかなり近づいていたのですが、うまくいきませんでした。
ここまで調べていくうちに
問題は、src/Eccube/Controller/EntryController.phpファイルの
activate()メソッドの中の
$CustomerStatus = $app[‘eccube.repository.customer_status’]->find(CustomerStatus::ACTIVE);
$Customer->setStatus($CustomerStatus);
$app[‘orm.em’]->persist($Customer);
$app[‘orm.em’]->flush();
↑
この4行の部分で起こっていることは明確になっていたので、あと一歩なのに・・・。
と遠い目をして何となく検索を続けていたときに、解決策の載っている掲示板に行き着きました。いやぁ、長かった。
今回の問題に取り組んで得たもの(経験値的なサムシング)と感想
「めんどくせー」と思ってしまうことの中には学びが多く含まれているという真理みたいなものがあります。ゲームやってても、極悪に強い敵は経験値が大きかったり、特別な武器を作れる素材が手に入ったりしますもんね。現実も同じ。とうことで、今回の学びなんかをまとめてみました。
トラブルは学ぶための絶好の機会
トラブルって「急ぎ」の対応を迫られるので、強制的に速習につながります。「やったことねーし。知らんし。めんどくせーし。」という言い訳をする余地すらないので、有無を言わずに調べて、手を動かしてなんとか理解しようとします。年中この調子で仕事していたらスーパーハカーになれるのでは?という中二病っぽい幻想に抱かれたりします。
ま、その前に体調を崩しそうなので程々がよいです。なんにせよトラブル対応というのは、経験値をガッポリ稼ぐチャンスなので前向きに取り組むのが吉です。
ソースコードを読んで気づくことがめっちゃある
「どうやったらプログラミングが上達しますか?」という初心者の鉄板質問への鉄板回答に「オープンソース読め」みたいなのがあります。それは嘘ではないですし、オープンソース読むだけでなくgithubとかでプルリクし始めて、オープンソースプロジェクトに積極的に関わるうちに気づいたらコミッターになってた、なんていう話はよく聞きます。
自分の業務に近いものや興味を刺激するものを見つけてオープンソースプロジェクトに取り組むというのは、スキルアップもキャリアアップも同時に実現できる道の一つだといえます。
とはいえ、僕レベルの凡人がソースコードを読むってなかなかにシンドイ。そういった意味でトラブル対応は、強制イベントなので怠惰な僕でもソースコードを読みます。で、読んでみると意外と理解できたり、なぜオブジェクト指向で書くとメンテナンス性が高まるのかを肌で感じることができたりします。文法について本で読んでるだけでは得られないものがそこにはあります。たまにはソースコード読もうって思いました。
EC-CUBE2系の速度が気になる
EC-CUBE関連の検索を鬼のようにかけて、一回調べるごとに検索結果の上位10件はすべてチェックしていたので、EC-CUBE界隈の雰囲気みたいなものも結構得られました。
で、気になったのは「EC-CUBE2系がレンタルサーバーでも鬼速い。速さは正義」みたいな情報。実際試していないですし、新規プロジェクトに2系をこれから投入するのはアレなので控えますが、時間を見つけて体感してみようと思っています。
EC-CUBE4系が気になる
SilexプロジェクトがEnd of Lifeを迎えたので、Symfony3ベースにチェンジしたEC-CUBE4系。速度面も改善されたりしつつ、開発が進んでいるので何かしらの形で貢献してみたいなぁと思っています。プラグイン開発も面白そうなので、手を染めてみます。
VPSで構築できるようになった方がいい
僕は長年主戦場をレンタルサーバーにしてきました。さくらインターネットに至っては12年以上使い続けています。レンタルサーバーは個人や中小企業が使うのに丁度いい価格帯・スペックなんですよね。
とはいえ、同じくらいの価格帯で自由さと速度を手に入れられるVPSも気になってます。もう、かれこれ5年くらい気になってて、ちょこちょこサーバー構築しては壊してみたいなのを繰り返してる状況です。僕の中でそろそろVPSで運用するっていうのもアリな時期に来ている気がします。EC-CUBEも速くなりそうだし。
オープンソースの偉大さを噛みしめる
EC-CUBE3のgithubのhistoryをチェックしてて、色んな開発者の方が意見を出し合いながらソフトを作り上げていく様子に感動を覚えたりしました。構造としては知っていたものの、EC-CUBEプロジェクトは日本語でやりとりされているので実感として「オープンソースすげぇ」って思えました。
そして、この記事を書くこともそうですが、僕なりに何かしら貢献できる部分があるだろうし、できる範囲で何かしら発信していこうと心に決めました。
まとめ
今回の一連の対応を通して、
・問題を一発で解決してくれる都合のいい銀の弾丸はない
・変わり続ける技術のトレンドの波に飲み込まれない程度には学び続ける必要がある
ということを改めて感じました。ま、それが楽しかったりもするから、これ系の仕事は自分に向いてるんでしょうね。
慌てず焦らず、精進していきます。
コメント