3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

EC-CUBE2系で「読み込み専用」のセッションを利用する

Last updated at Posted at 2023-12-26

前書き

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系で動いているサイトはたくさんあるかと思います。
どなたかのお役に立てれば幸いです。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?