前書き
EC-CUBE2系を使っていて、結構悩ましいのがセッション周りの制御ですよね。
排他制御周りで、↓の件があったりします。
http://svn.ec-cube.net/open_trac/ticket/571
EC-CUBE 開発フォーラムでも、その関係のやりとりが見当たります。
排他制御する最も簡単な方法は、セッション管理をファイルにして、PHP標準のセッション管理(SessionHandler)に乗っかる方法(少しread周りはいじる)ですが、ファイルではない方法でセッション管理をしたい場合も多々あります。
そうなると、自前で排他制御を組み込んだり、でも、AjaxでのAPI呼び出したりしているとロック待ちで時間がかかったりするので自動マージの仕組みを考慮したりする必要がでてきます。
ただ、高速化のためにセッションの自動マージの仕組みを作るのは、かなり骨が折れる開発になりがちです。
そんな時に、手軽に、ロック待ちを回避できるカスタマイズについて紹介しようと思います。(本題)
EC-CUBE2系で「読み込み専用」のセッションを利用する
APIやブロックの中には、セッションに書き込む必要は無いものも割とあります。
そんな時には、「読み込み専用」のSessionFactoryクラスを作って、それを利用する様にするのが簡便です。
具体的には、↓のように read_and_close
を指定して session_start
する SC_SessionFactory_UseCookieReadOnly_Ex
を作成します。
require_once CLASS_REALDIR . 'sessionfactory/SC_SessionFactory_UseCookie.php';
class SC_SessionFactory_UseCookieReadOnly_Ex extends SC_SessionFactory_UseCookie {
protected function startSession()
{
session_name('ECSESSID');
session_start([
'read_and_close' => true, // 書き込みは行わない
]);
}
}
そして SC_SessionFactory
にて、「読み込み専用」のセッションで良い場合には、 SC_SessionFactory_UseCookieReadOnly_Ex
の方を使う様にしておきます。
if (GC_Utils_Ex::isSessionReadOnlyFunction()) {
$session = new SC_SessionFactory_UseCookieReadOnly_Ex; // 読み込み専用モード(セッションへの書き込みをしない)
} else {
$session = new SC_SessionFactory_UseCookie_Ex;
}
セッションが開始されるのはかなり早い段階(require_base.php
が読み込まれる際)なので、制御するための指定方法が限られますが、require.php
を読み込むよりも前の段階で、↓の様な感じで定数で指定しておき、それを基に判定を返すメソッド介して判定するという方法で、APIでもブロックでも画面でも対応できています。
define('SESSION_READ_ONLY_FUNCTION', true); // セッションは「読み込み専用」
GC_Utils.php
あたりに↓のメソッドを作成
/**
* セッションを「読み込み専用モード」で利用したい機能かを判定
*
* @return bool セッションを「読み込み専用モード」で利用したい機能か
*/
public static function isSessionReadOnlyFunction() : bool
{
return defined('SESSION_READ_ONLY_FUNCTION') && SESSION_READ_ONLY_FUNCTION === true;
}
まだまだEC-CUBE2系で動いているサイトはたくさんあるかと思います。
どなたかのお役に立てれば幸いです。