Eccube

ECCUBE 2.13.x on AWS EC2 & EFS

ECCUBE 4がリリースされており、3ですら乗り遅れていますが、
中身をイジリまくっているシステムとしては、
安易に移行ができません。

この度、PHP7への対応を行った「EC-CUBE 2.17.0α」の存在を知りましたが、

https://www.ec-cube.net/news/detail.php?news_id=290

これも1年前のリリース。

まだ、開発者向けのαなので、

***

さて、この度、AWS 東京リージョンで、EFSが使えるようになり、
2つ以上のEC2上でのファイル共有がすこぶる楽になったわけですが、
全然、使いこなせていませんでした。

※EFS ≒ NFS ≒ファイル共有システム

その理由は、過去に行った改造によるもの

通常

  • data
  • html

のフォルダーになっていますが、
フォルダー移動が面倒という理由から、
html下にdataフォルダーを移動させました。

define.phpで宣言されている

/** HTMLディレクトリからのDATAディレクトリの相対パス */
define('HTML2DATA_DIR', '../_data/');

を、「./_data/」に書き換えるだけで、
作業効率が著しく上がったのですが、

2台のEC2のファイル更新が面倒で面倒で、
ようやく導入されたEFSに飛びついたわけですが、

全ファイルをEFSに移動させたところ、

超遅い!!

 

これは、smartyのtemplate_c以下に生成される
テンプレートファイルの読み書きの問題だと思いますが、

user_data(ベースのテンプレートが保存されている)だけを、
EFSに移行させたところ、速度は改善されました。

dataフォルダーは滅多に書き換えることがないのですが、
このdataが下層フォルダーにあることで、
EFSに乗せることができない状況にありました。

=HTML2DATA_DIR ../data/ >> ./data/の書き換えが原因

 

ということで、今回標準のdataフォルダーを、
htmlの同層にもどし、htmlをEFSに載せましたが、

当初、なんでこんな2層にしているだろう?
と疑問に思っておりましたが、

NFS(EFS)にHTMLを乗せるための、構造だったんですね!

製作者の意図が汲み取れず、自分が情けなくなりました。。。

 

これで、html以下にあるshoppingなどのphpを書き換えも、
2台分書き換えなくてよくなり、大変便利になり、
ECCUBEの開発元のロックオンさんの設計の素晴らしさに痛感しました!

 

3系は、システム設計が根本から変わっており、
参入障壁が高いことから、2.17に期待したいところですが、
すでに4リリースされていることもあり、

すでに過去の遺産・・・

 

来年こそは、3系に移行できたら良いなと思っている今日このごろです。

-

ECCUBE 2.13.x シーケンステーブル

ECCUBE 2.13.x系のテーブルを見ると、
「_id_seq」で終わるテーブルがある。

各テーブルで主キーに「Audo_Incliment」を指定すれば良いもののを、
あえて、テーブルで管理している。

まあ、いいんだけど、この_id_seqで終わるテーブルが、
以外に多くて、テーブルを探すときに、邪魔・・・

***

ということで、

すで、Eccube 3.x系が主流なので、移行すべきなところはさておき、
これらのシーケンステーブルを削除し、1つのテーブルにまとめてみた。

新たに作成したテーブルは、「_sequence」とし、
項目は、以下の通りである。

  • seqeuence_name [varchar(64)] :シーケンス名
  • sequence[int]:
  • updated[datetime]: 保守用最終更新時刻

SC_Query_Exで、クラスを拡張したのが、以下のコードで、
「_sequence」というテーブルがあるときのみ、作動する。
※シーケンス名が存在するかも、チェックしたほうがいい。

ポイント

$this->conn->nextID で、値を拾ってきているのに対し、

nextValを使っているコードを、すべて書き直すわけではなく、
nextVal内での取扱い、
「_sequence」へ個別にupdate / selectしているだけなので、
コードの修正は、最小限となっております!

<?php

require_once CLASS_REALDIR . 'SC_Query.php';

class SC_Query_Ex extends SC_Query
{
    /**
     * 次のシーケンス値を取得する.
     *
     * @param string $seq_name 取得するシーケンス名
     * @param integer 次のシーケンス値
     */
    public function nextVal($seq_name)
    {
    	$nextID	= $this->conn->nextID($seq_name); // 元に戻すときのために、実行


    	// 試験中
	if ($ret = $this->query("show tables like '_sequence'")) {
		//
		$this->update('_sequence',
				array('sequence' => 'sequence + 1', 'updated' => 'now()'),
				"sequence_name = '$seq_name'");
			$_ = $this->currVal($seq_name);
			if (empty($_)) {
				// レコードが無いとき
				$this->insert('_sequence', array($seq_name, $nextID));
				return $nextID;
			}
		} else
	        return $this->conn->nextID($seq_name);
    }

    /**
     * 現在のシーケンス値を取得する.
     *
     * @param  string  $seq_name 取得するシーケンス名
     * @return integer 現在のシーケンス値
     */
    public function currVal($seq_name)
    {
    	// 試験中
	if ($ret	= $this->query("show tables like '_sequence'")) {
		//
		$ret	= $this->select('sequence', '_sequence', "sequence_name = '$seq_name'");
var_dump($seq_name. ': '. $ret[0]['sequence']);
		return $ret[0]['sequence'];

	} else
		return $this->conn->currID($seq_name);
    }
}

※動作確認したが、実運用はしていない状態のコードなので、要修正

一応、動くは動くものの、
1日1万件の処理とかになると、耐久性には心配が残ります。

-