Home »  » 2006年 » 11月 » 12日

$xoopsOption[’nocommon’]

XOOPS Cube Legacy2.1では、モジュール開発者向けにモジュールの実行モードを2つ追加しました。
従来のXOOPS 2.0.xでは、モジュール開発者がXOOPSの実行環境を読み込む事によるオーバーヘッドを回避するために、


<?php
$xoopsOption
['nocommon']=1;
include 
'../../mainfile.php';
?>

というように書くと、XOOPS_ROOT_PATH等のmainfile.phpに定義された定数だけを読み込むだけで、include/common.phpのinclude実行を行わない様にすることができます。

XOOPS2.0.xでは、この状態でXOOPSが提供しているfunctions.php等を独自に参照することが可能だったのですが、XOOPS Cube Legacy2.1ではfunctions.php内の関数が、XCube_Root等の XOOPS Cubeクラス群を参照するようになったため、定数を読み込んだだけの状態では、functions.phpのincludeに失敗してしまいます。

そこで、XOOPS Cube Legacy2.1 Beta3-d の時点で、$xoopsOption['nocommon']が設定されていても、必要最低限のXOOPS Cubeクラス群の初期化を行うように変更しました。
これによってXOOPS2.0.x用のモジュールで$xoopsOption['nocommon']を指定しているプログラムの大半が稼動可能になったはずです。

しかしながら、$xoopsOption['nocommon']を指定する目的の大半が、特定処理のオーバーヘッド軽減による高速化であったことから、この「必要最低限のXOOPS Cubeクラス群の初期化」でさえも重く感じる場合があるようです。
何人かのメンバーとの討議の結果、新たに2つのPHP定数を用意して、これらのモジュール開発者の要望の期待に答えることにしました。 既存の$xoopsOptionでは無くPHP定数にしたのは、新たなグローバル変数の定義をコアチームとしては避けたかったからです。

モジュールプログラム内で、この2つのPHP定数を使用する方法は以下のとおりです。
1. 単純にmainfile.phpで定義されている定数を参照したい場合


<?php
define
('_LEGACY_PREVENT_LOAD_CORE_'1);
include 
'../../mainfile.php';
?>

上記指定によってmainfile.phpを読み込むことによって、XOOPS_URLなどの定数参照が可能になります。但しこの状態では、XOOPS Cube Legacyが提供しているファイルをincludeすることはたいていの場合エラーとなります。もし、データベースにアクセスする場合には、XOOPS_DB_HOST、XOOPS_DB_USERなどの定数を元にして直接PHPのmysql関数群を呼び出す必要があります。

2. XOOPSのクラスや関数群をある程度のコントロールしの元に読み込んで、オーバーヘッドを減らしたい。


<?php
define
('_LEGACY_PREVENT_EXEC_COMMON_'1);
include 
'../../mainfile.php';
?>

この記述は、XOOPS Cube Legacy2.1 Beta3-d の時点での、


<?php
$xoopsOption
['nocommon'])=1;
include 
'../../mainfile.php';
?>

と等価で、この記述方法もまだ対応していますが、$xoopsOption['nocommon']はXOOPS Cube Legacy2.1では非推奨とします。
上記指定の場合には、mainfile.php内での定数定義に加えて、include/cubecore_init.phpが読み込まれます。
cubecore_init.phpでは、XCube_Rootシングルトンインスタンスの生成及び、settings下のiniファイルに基づいてコントローラの初期化(通常はLegacy_Controllerの初期化)を行います。これによって、include/functions.phpの中ででDBアクセスを伴わない関数を中心とした幾つかが使用可能となります。
さらに、


<?php
define
('_LEGACY_PREVENT_EXEC_COMMON_'1);
include 
'../../mainfile.php';
$root=&XCube_Root::getSingleton();
$root->mController->executeCommonSubset();
?>

というように、Legacy_Contorollerに新たに追加したexecuteCommonSubsetを呼び出すことによって、
DBアクセスをはじめとして、Legacyのかなりの範囲のクラスメソッドを含めて利用することができます。
executeCommonSubset()は、executeCommon()内の処理のうちで、preloadフォルダ内のActionFilter呼び出しとか、ユーザー認証及びセッション管理、xoopsConfigの読み込み、モジュール情報の初期化などを省いたサブセットとなっています。これらを省くことによって、処理の内容によってはかなりの高速化が見込めることとなります。
executeCommonSubset(false)と関数パラメータにfalseを設定することによってさらにDB接続処理のスキップも可能です。
legacyモジュールでもadmin/css.phpという管理画面のスタイルシートのフォールバック対応処理について、
このモードで稼動するように変更したことによって、処理時間を半分以下に短縮することが可能になりました。
これらの新しい動作モード定数の仕様については、現在はCVSに投入されており、XOOPS Cube Legacy 2.1 Beta CVS Snapshotより取得可能ですが、すでにXOOPS Cube legacyを使用している方は、mainfile.phpの修正が必要です。

2.1 Beta3-c以前


<?php
if (!isset($xoopsOption['nocommon']) && XOOPS_ROOT_PATH != '') {
        include 
XOOPS_ROOT_PATH.'/include/common.php';
    }
?>

または、
2.1 Beta3-d以降


<?php
@include_once XOOPS_ROOT_PATH.'/include/cubecore_init.php';
    if (!isset(
$xoopsOption['nocommon']) && XOOPS_ROOT_PATH != '') {
        include 
XOOPS_ROOT_PATH.'/include/common.php';
    }
?>


<?php
if (!defined('_LEGACY_PREVENT_LOAD_CORE_') && XOOPS_ROOT_PATH != '') {
        @include_once 
XOOPS_ROOT_PATH.'/include/cubecore_init.php';
        if (!isset(
$xoopsOption['nocommon']) && !defined('_LEGACY_PREVENT_EXEC_COMMON_')) {
            include 
XOOPS_ROOT_PATH.'/include/common.php';
        }
    }
?>

に変更していただく必要があります。


コメント

このコメントのRSS

この投稿には、まだコメントが付いていません

コメントの投稿

ごめんなさい、現在コメントを付けることは出来ません


18 queries. 0.020 sec.
Powered by WordPress Module based on WordPress ME & WordPress

flagflag

メインメニュー

XOOPS初心者サーチ


Add to Google

Xoops Cube Project

XOOPS Cube Project Site

XC Developers Ring

http://img.simpleapi.net/small/http://www.peak.ne.jp/xoops/ SIZE:128x128(7.6KB)