3

スクリプトを実行するたびにデータベースへの接続を確立しています。$dbこれは、PDO インスタンスをグローバル変数に割り当ててからコントローラーに渡すことによって行われます。

$db = new \ay\pdo\PDO('mysql:dbname=foo;charset=utf8');

ただし、キャッシュ ロジック レイヤーがあるため、95% のリクエストで 1 つのクエリを実行する必要はありません。接続を確立するための 5 ミリ秒は重要ではないように思えるかもしれませんが、これは要求時間の 30% です。1 分間に最大 200K のリクエストを処理する場合、これはかなりの数です。

アプリ

実行するクエリがある場合にのみ、データベースへの接続を確立したいと考えています。スクリプトに大きなオーバーヘッドをかけずにこれを達成するための推奨される方法は何ですか?

4

2 に答える 2

2

プロキシ設計パターンを使用する場合があります/使用できます。したがって、最初にデータを要求するときに、db への接続を処理/作成します。

そのため、PDO を直接使用する代わりに、プロキシ オブジェクトを作成します。クエリがある場合は、db への接続を作成し、クエリを実行して (遅延読み込み)、後で同じ PDO オブジェクトを再利用します。

http://en.wikipedia.org/wiki/Proxy_pattern

http://en.wikipedia.org/wiki/Flyweight_pattern

プロキシの例: https://github.com/ezimuel/PHP-design-patterns/blob/master/Proxy.php

于 2013-06-15T07:55:31.780 に答える
1

$db->method を使用する代わりに、db()->method を使用してください。db() は、単一の db オブジェクトを返す pbject の関数または関数になります。接続が存在する場合はそれを返し、そうでない場合はそれを作成して返します。

編集:コメントを参照すると、おそらくシングルトンまたはグローバル関数はあなたが探していたものではありませんでした. とにかく、すべての接続パラメーターを持つオブジェクト $db を作成できたが、接続を作成しなかったということでした。次に、次のようなものを呼び出すことができます

$db->getDb()->method 

getDb() は、最初に $db に接続があるかどうかをチェックし、そうでない場合はチェックします。次に、それを作成します。各呼び出しの前に、または $db オブジェクトの内部で getDb() を使用する必要があります。

于 2013-06-15T08:02:36.730 に答える