ホーム > フォーラム > 開発 > コア開発 > データベース接続情報のみ取得したい場合について

データベース接続情報のみ取得したい場合について
投稿者: nao-pon | 投稿日時: 2006/11/7 17:30 | 閲覧: 17497回
nao-pon
お疲れ様です。

Beta3-d になり、mainfile.php にて

@include_once XOOPS_ROOT_PATH.'/include/cubecore_init.php';


とするようになりました。

以前は、$xoopsOption['nocommon'] を指定して、mainfile.php のみを読み込めば、データベース接続情報が''めっちゃ軽く''得られましたが、今回より''めっちゃ軽い''とは言えなくなったと思われます。

例えば、XP-Weather, tagmemo などでは、Google Suggest のような仕組みを用意しています。Suggest はキー入力のたびにリクエストを送るので、''めっちゃ軽く''が要求されるのですが、何か代替措置等ありますでしょうか。

cache に独自の読み込み用ファイルを生成して、そこから読み込むようにしたほうがよいでしょうか?

コメント(7)

Re: データベース接続情報のみ取得したい場合について 
投稿者: minahito | 投稿日時: 2006/11/7 18:06
minahito
こんにちは。

nocommon 技に関しては、 X2 時代は単にコアの初期処理に噛み込めなかったので使っていたという局面が多く、あまりにもひどく構造に依存するうえに、活用範囲が広いため、「互換が取れたらラッキー」程度の存在になっています。 nocommon 技を使って回避した後 function を使うというようなプログラムが多くあるのですが、 Legacy では function の多くは XOOPS Cube がブートアップしていないと使えません。そのため今回は、「最低でも XOOPS Cube をブートアップさせる」ところまでやってます。

定数だけを取る代替手段となると、 XOOPS Cube システムと base module の両方がブートアップする前に止まる新たな nocommon (例:super_nocommon)を追加するとかって話になってくると思うのですが……

正直、正式に保証するものかどうか頭が痛いところです。その技を使用した場合はそのモジュールは Base module に独自に依存しなければいけない(XOOPS Cube 自体は2段階の換装を提供しているため、ここが強い依存性を緩和する仕組みになっている)ので、それを Legacy の正式な手順として保証することは割とコンセプト崩壊的な意味を持つのではないかと気になっています。

たとえば mainfile.php のみで切り抜けた場合、DB インスタンスを換装するタイプの Base はライブラリの位置が違うなどの理由で使えなくなるという感じです。そういう Base であっても ini ファイルの書き方次第では Legacy_Controller として(実名が HogeHoge_Controller であっても)起動可能なのですが、 mainfile.php だけでストップした場合は、このへんの XOOPS Cube の換装情報などはすべて掴めませんから、ファイル位置からしてすべて Base に依存した状態になります。つまりほとんどのモジュールは、

- 依存するモジュールの互換モジュールでは使用可能

なのですが、このケースでは、

- 依存するモジュールの互換モジュールが Cube の起動手順における互換に留まっていた場合は使用不可能

です。

ここをうまく(一番大変なのはマニュアルだと思いますが)処理することを前提で新しい $xoopsOption 項目を追加するというのはアリだと思うのですが……

2.1 が出た後のモジュールの開発の動きを見てから判断したいところがあります。現時点ではちょっと怖いところがありますし、高速化に相当するネタになるので、正規手段に関しては 2.1 が出てから改めて悩ませて貰えないでしょうか。

# nocommon は自分も exFrame で X2 のブートを全回避するのに
# 使っていたので、 Cube の正規的換装手段が使われずに回避技
# がメジャーになり、かつそれを保証し続けなければならない事態
# に陥っていくのがちょっと怖いんです。
Re: データベース接続情報のみ取得したい場合について 
投稿者: nao-pon | 投稿日時: 2006/11/7 23:57
nao-pon
引用:
正直、正式に保証するものかどうか頭が痛いところです。その技を使用した場合はそのモジュールは Base module に独自に依存しなければいけない(XOOPS Cube 自体は2段階の換装を提供しているため、ここが強い依存性を緩和する仕組みになっている)ので、それを Legacy の正式な手順として保証することは割とコンセプト崩壊的な意味を持つのではないかと気になっています。


たしかにその通りですね。正式に保障するとなると、セキュリティ的に大穴が開く可能性があることも含めて担保する必要(マニュアル整備とか)がでてきて、せっかくの「セキュア」というコンセプトが、揺らいでしまうかも知れませんね。

cache に書き出すなどの方法を考えて見ますが、apache(httpd) でファイル作成する以上 apache から書き込み可能になるわけで、万が一他のスクリプトから書き換えられた時のことまで考えると・・・。

ん〜悩みどころです。
Re: データベース接続情報のみ取得したい場合について 
投稿者: minahito | 投稿日時: 2006/11/8 9:21
minahito
場合によっては mainfile.php の考え方をむちゃくちゃ変えてしまうというのもありかもしれないですね。それも最初ちょっと考えたのですが、バージョンアップがあまりにも大変になってしまうので 2.1 ではやめようかと思って進んできたのですが……ちょっと考えたのは、こんな感じです。

require_once dirname(__FILE__) . "/config.inc.php";

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

これで、従来の定数は config.inc.php に書いておく。すると、

1. 通常の起動のトリガーとして引くのは mainfile.php (互換と伝統のため)
2. function 類を引っ張るための nocommon は従来の nocommon 技を使用する(最低でも XOOPS Cube はブートアップする)
3. まじで設定しかいらない場合は config.inc.php のほうを引っ張ってもらう

の3種類の引用方法がとれます。 3 は単にファイルを分けているところを読み込んでいるだけなので nocommon と異なりそれ自体がイリーガルな方法なので、「正式なワークアラウンド」ではないという見解で筋が通るかもしれません。

こうすればブートに関わる重要なファイルである mainfile.php はこれまでバージョンアップの煩雑性から手が出せませんでしたが、 2.1 で一度こうしておけば、今後は不変更は config 側、起動手順に関わる変更は mainfile.php 側で行えることになります。

ただこれだと「2.1 から 2.0.x には戻れる」というのはなくなりますが……
(今だと1行パッチしますが、あれでも 2.0.x にはそのままダウングレードできたりします)
Re: データベース接続情報のみ取得したい場合について 
投稿者: nao-pon | 投稿日時: 2006/11/9 0:12
nao-pon
引用:

ちょっと考えたのは、こんな感じです。

require_once dirname(__FILE__) . "/config.inc.php";

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

これで、従来の定数は config.inc.php に書いておく。


これ!大賛成です!
mainfile.php 起動手順の見直しなんかもしやすくなるということなので、ぜひ実装していただきたいです。
Re: データベース接続情報のみ取得したい場合について 
投稿者: nobunobu | 投稿日時: 2006/11/11 11:06
nobunobu
のぶのぶです。
詳細説明つきレスを書いている最中にブラウザハングしたので、とりあえず要点だけを書かせてもらいます。
詳細は明日になるかもしれません。

config.inc.phpに関しては、XOOPSのインストーラの修正やアップグレード時の混乱などの予想から、今回は見送ることにいたしました。

但し、nao-ponさんのようなリクエストはモジュール作者側としては、十分理解できますので、
いままでの、$xoopsOption['nocommon']=1; 指定の替わりとして
define('_LEGACY_PREVENT_LOAD_CORE_', 1);

というのを用意することにしました。

一応これをベースにしたものをCVSにコミットしましたが、反映されるのは、mainfile.dist.phpだけになるので、

この機能を使うためには、既存のmainfile.phpの
2.1 Beta3-c以前
    if (!isset($xoopsOption['nocommon']) && XOOPS_ROOT_PATH != '') {
        include XOOPS_ROOT_PATH.'/include/common.php';
    }

または、
2.1 Beta3-d以降
    @include_once XOOPS_ROOT_PATH.'/include/cubecore_init.php';
    if (!isset($xoopsOption['nocommon']) && XOOPS_ROOT_PATH != '') {
        include XOOPS_ROOT_PATH.'/include/common.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';
        }
    }

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

こんな仕様でいかがでしょうか?
Re: データベース接続情報のみ取得したい場合について 
投稿者: nobunobu | 投稿日時: 2006/11/12 14:49
nobunobu
引用:

nobunobuさんは書きました:
のぶのぶです。
詳細説明つきレスを書いている最中にブラウザハングしたので、とりあえず要点だけを書かせてもらいます。
詳細は明日になるかもしれません。

続編に関しては、ブログの方にまとめさせてもらいました。
[のぶのぶXOOPS - メモランダム - $xoopsOption[’nocommon’]]
Re: データベース接続情報のみ取得したい場合について 
投稿者: nao-pon | 投稿日時: 2006/11/13 22:54
nao-pon
引用:

nobunobuさんは書きました:
続編に関しては、ブログの方にまとめさせてもらいました。
[のぶのぶXOOPS - メモランダム - $xoopsOption[’nocommon’]]


のぶのぶさん、こんにちは。

了解です!ちょうど、xpWiki の権限設定でユーザーを選択する場合に、サジェストを使ったので早速対応させておきました。

ありがとうございました。

    投票(0)

    新しいものから | 古いものから | RSS feed
     
    To Top