web-dev-qa-db-ja.com

複数のモジュールで1つのpdo接続を使用しますか?

同じページに複数のモジュールがあり、pdo接続を介して同じ外部データベースに個別に接続しています。さらにモジュールを追加したので、ウェブサイトが遅くなっています。私の推測では、同じ外部データベースに複数回接続すると速度が低下すると思います。

次に、外部データベースに1回接続し、すべてのモジュールでこの接続を使用します。どうすればよいですか?また、コードを削除せずにWebサイトを更新できるようにしたいと考えています。

私はjoomlaクエリの代わりに通常のphpクエリを使用したいので、JFactoryを使用して外部データベースへの新しい接続を開かなかったのです。

1
loranga

あなたが何をしているのかを達成する方法はたくさんあります-以下はただ一つのアイデアです。独自のシングルトンを作成する代わりに、db接続を使用してオブジェクト(およびおそらくdbコードの束)を、ファクトリーを介してすでにアクセス可能な使用可能なシングルトンの1つにアタッチできます。次のコードはモジュールのエントリファイルにあり、追加のクラスは同じディレクトリ内のファイルにあります。

// Grab a copy of the application object
$app = JFactory::getApplication();
// Check if we've already added our extra object
if(!isset($app->extraDB)){
    require_once 'ExtraDB.php'; // include the file with a class with all our stuff in it
    $app->extraDB = new ExtraDB; // Piggyback our new db object onto the application
}
// the same object is now available to all modules containing this code
echo $app->extraDB->example();
1
jamesgarrett

この質問に対する1つの答えは

すべてのモジュールがアクセスできる単一のライブラリを作成します。

独自のphpクラスを作成します。 joomlaインストールの/ libraries内の独自のカスタムライブラリフォルダーにそれらを追加します。

命名規則に従うフォルダ内のクラスは、JLoader :: discover()メソッドを使用してまとめて登録できます。 discoverメソッドは、フォルダー内のファイル名を調べ、それらの名前に基づいてクラスを登録します。

次に、ライブラリクラスファイルをロードするためのローダーが必要になります。これは、

  1. ライブラリを見つける

///libraries/mylibフォルダー内のすべてのファイルを次のような名前のクラスとして登録します。MyLib JLoader :: discover( 'Mylib'、JPATH_LIBRARIES。 '/ mylib');

  1. クラス名にプレフィックスを付けて、簡単に見つけられるようにします。

//オートローダーに「Mylib」で始まるクラスを特定のフォルダーで探すように指示します。 JLoader :: registerPrefix( 'Mylib'、JPATH_LIBRARIES。 '/ mylib');

すべてのモジュールの単一のデータベースオブジェクトの場合、データベースクラスはシングルトンパターンに従う必要があります。

シングルトンは、単一の(つまり、シングルトンという名前の)クラスインスタンスがあり、それがグローバルアクセスポイントになるように設計されています。この単一インスタンスとともに、グローバルアクセスと遅延初期化があります。

ここでシングルトンパターンを使用するDBクラスの例:

<?php
/**
* PDO Singleton Class v.1.0
*/
class DB {
    protected static $instance;
    protected function __construct() {}
    public static function getInstance() {
        if(empty(self::$instance)) {
            $db_info = array(
                "db_Host" => "localhost",
                "db_port" => "3306",
                "db_user" => "user",
                "db_pass" => "pass",
                "db_name" => "ftonato",
                "db_charset" => "UTF-8");
            try {
                self::$instance = new PDO("mysql:Host=".$db_info['db_Host'].';port='.$db_info['db_port'].';dbname='.$db_info['db_name'], $db_info['db_user'], $db_info['db_pass']);
                self::$instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);  
                self::$instance->query('SET NAMES utf8');
                self::$instance->query('SET CHARACTER SET utf8');
            } catch(PDOException $error) {
                echo $error->getMessage();
            }
        }
        return self::$instance;
    }
    public static function setCharsetEncoding() {
        if (self::$instance == null) {
            self::connect();
        }
        self::$instance->exec(
            "SET NAMES 'utf8';
            SET character_set_connection=utf8;
            SET character_set_client=utf8;
            SET character_set_results=utf8");
    }
}
?>

これは次のように使用できます。

<?php
require_once ('database.class.php');
try {
    $db = DB::getInstance();
    DB::setCharsetEncoding();
    $sqlExample = 'SELECT * FROM users WHERE _id = 1';
    $stm = $db->prepare($sqlExample);
    $stm->execute();
    return $stm->fetchAll(PDO::FETCH_ASSOC);

} catch (Exception $e) {
    print $e->getMessage();

}
0
Andy Joe