web-dev-qa-db-ja.com

スタンドアロンのJDatabaseを使用する。 Joomlaアプリケーションのブートストラップなし

Joomlaアプリケーションなしでjdatabaseオブジェクトをインスタンス化できますか?明らかなユースケースは、APIやcronなどのサイトのスタンドアロンコードに直接エンドポイントを開き、a)1つのクラスだけが必要な場合にJoomlaアプリケーション全体をブートストラップすることによるパフォーマンスへの影響を避けたい場合です。 b)JoomlaアプリケーションとAPIエンドポイントが共有するクエリを書き換えます。

私はコードを抽出して揺らすだけのこのアプローチがあることを理解しています:

http://www.solutionsamir.com/20110720155/Programming/PHP/Stand-Alone-Joomla-Database-Abstraction-Class.html

しかし、私がライブラリを掘り始める前に、誰かが私が試みていることを試みたことを願っています。

2
jamesgarrett

bootstrapファイルが利用できない場合、アプリケーションなしでフレームワークをロードして、appと呼ばれるフォルダーでこのようなパフォーマンスを確認しました。

$time_start = microtime(1);

define('_JEXEC', 1);

$base = str_replace("/app", "", __DIR__);

define('JPATH_BASE', $base);

require_once JPATH_BASE . '/includes/defines.php';
require_once JPATH_BASE . '/includes/framework.php';

$db = JFactory::getDBO();
$query = $db->getQuery(true)
    ->select('*')
    ->from($db->qn('#__users'));
$db->setQuery($query);

$users = $db->loadObjectList();

echo "<pre>" . print_r($users,1) . "</pre>";
echo microtime(1) - $time_start;
die();

そして置く

$time_start = microtime(1);

joomlaのindex.phpファイルの先頭に移動し、ダミーコンポーネントのエントリファイルで次のスクリプトを実行して、コンポーネントのビューにルーティングするメニュー項目を追加します。

defined('_JEXEC') or die;

global $time_start;

$db = JFactory::getDBO();
$query = $db->getQuery(true)
    ->select('*')
    ->from($db->qn('#__users'));
$db->setQuery($query);

$users = $db->loadObjectList();

echo "<pre>" . print_r($users,1) . "</pre>";
echo microtime(1) - $time_start;
die();

パフォーマンス結果

joomlaアプリケーションなし

  • 0.034259080886841
  • 0.03374195098877
  • 0.034512996673584
  • 0.034684181213379

joomlaアプリケーション>ルーター>メニュー+コンポーネント

  • 0.24458599090576
  • 0.29617881774902
  • 0.29315781593323
  • 0.3031439781189

私はおそらく、より高速なアプローチを探すのをやめるのに十分なパフォーマンスの向上であり、プラットフォーム全体を持っていることはおそらくとにかく役に立つでしょう。しかし、誰かがcmsのビットを使用してカスタムAPIエンドポイントを提供するための別のスリム化された方法を持っている場合、私は聞きたいと思います。

1
jamesgarrett

はい、可能です。オートローダーを実行するbootstrap.phpを含める必要があります。これにより、名前空間付きのDatabaseフレームワークパッケージを呼び出すことができます。

次に例を示します。

define('_JEXEC', 1);
define('JPATH_BASE', __DIR__);

require JPATH_BASE . '/includes/defines.php';
require JPATH_BASE . '/libraries/bootstrap.php';

// Make the database driver
$dbFactory = new Joomla\Database\DatabaseFactory;

$db = $dbFactory->getDriver(
    'mysqli', [
        'Host'     => 'localhost',
        'user'     => 'MY DATABASE USERNAME',
        'password' => 'MY DATABASE PASSWORD',
        'database' => 'MY DATABASE NAME',
        'prefix'   => 'xxx_'
    ]
);

$query = $db->getQuery(true)
    ->select('*')
    ->from($db->qn('#__users'));
$db->setQuery($query);

$users = $db->loadObjectList();

この例では、スタンドアロンのPHPファイルがJoomlaサイトのルートにあることを前提としているため、ファイルが存在する場所によっては、2行目を変更する必要がある場合があります。

お役に立てれば

1
Lodder