Eccube

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万件の処理とかになると、耐久性には心配が残ります。

-

AWS x Eccube2.13. x メール遅延 (PHP5.6系の罠)

Eccubeから注文などのメールが、約10分遅延する問題があり、
まだ、ピークではないので、やり過ごしていたが、

ここ1ヶ月ほど悩んだことが、やっと解決された!!

***

原因は、PHP 5.6 / PEAR::SMTPにあり!

5.6から、587ポートに接続のTLSは、認証が必要になっています。

function enableCrypto($enabled, $type){
  if (version_compare(phpversion(), "5.1.0", ">=")) {
    if (!is_resource($this->fp)) {
      return $this->raiseError('not connected');
    }
    // ▼ この行を追加
    stream_context_set_option($this->fp, 'ssl', 'verify_peer_name', false);

    return @stream_socket_enable_crypto($this->fp, $enabled, $type);// 問題の場所
  } else {
    $msg = 'Net_Socket::enableCrypto() requires php version >= 5.1.0';
    return $this->raiseError($msg);
  }
}

PHP5.6でSMTP送れない件 – ド忘れ防止雑記帳より

前バージョンのPEAR::SMTPにはついていたコードなんでしょうか?
7行目のコードを足せば、動くようになります!


AWS SES の設定や制限解放

SESの設定は、こちら。

あとは、制限解放依頼。

Amazon SES rejected

初期は、サンドボックスになっているので、登録したメアドにしか、
メールが送れないので、その制限を解除↓

解除リクエスト先 >?http://aws.amazon.com/ses/extendedaccessrequest/

参考 >?Amazon SESの送信制限を解除する(SandBoxの外へ移動する)

※スパムメール送る送信元としてSESが利用されていることが、多いらしいので、サイトがある程度完成してから、申請しました。

AWS SES 送信テストサンプルコード

PHP で Amazon SES の SMTP インターフェイスから E メールを送信する

の通り、USER / PASSWORDを指定するだけなんですが、
PEARが入ってないと、当然動きません。

※USER / PASSWORD は、SESのメール設定時にIAMで取得する乱数文字
※HOSTは、今回オレゴンを使ったので、

define('HOST', 'email-smtp.us-west-2.amazonaws.com');

また、AWS(Amazon AMI)の場合、

include_path = .:/usr/share/pear:/usr/share/php

となっているので、インストールするか、
ECCUBE内にもある(data/module)ので、これを追加してやる。

この場合、ECCUBE のルートにあるdefine.phpで書かれているとおり、

/** data/module 以下の PEAR ライブラリを優先的に使用する */
set_include_path(realpath(dirname(__FILE__) . '/' . HTML2DATA_DIR . 'module') . PATH_SEPARATOR . get_include_path());

をECCUBE固有の固定値を修正し、
サンプルコードの上の方に書き足せば、動きます。
(直接、module/Mail.phpをincludeしようとしたりして、罠にハマったのでw)

ECCUBE 2.13系?MAIL_BACKEND >> SMTP

 define('MAIL_BACKEND', 'mail');

config.phpのこの行を、mail >> smtpに変え、host / port / user / passwordを適切に変えるだけ。
「ECCUBE SMTP」で検索すると、module / Mail / smtp.phpも書き直せ
と出てきますが、そんな必要はありません。!

古いバージョンでは、書き直しが必要だったかもしれませんが、
config.phpの変更だけで、おk。

呼び出し元(module/mail.php)のソースを読む限り、

Mail->factory('smtp', $param)

このコードで、上記configで指定されたsmtpの値
=$paramが渡され、引き継がれています。


また、まとまってない文章っぽいですが、お察しくださいw

実際に注文してみたところ、全く遅延はありませんでした!
MAIL_BACKENDのmail / PHP のメールは、規制がかかっているので、
SES取得、制限開放して、

MAIL_BACKEND = SMTPで運用すると、幸せになれます!

関連

-