3

teamtreehouse の PHP/MySQL プロジェクトのサンプル サイトをいじっています...「モデル」コードでは、products.php というファイル内の関数内にすべての DB 呼び出しがあります。これらの関数のそれぞれが新しい PDO を作成します。インクルードファイルをインポートすることにより、オブジェクト..例:

function get_products_recent() {

    require(ROOT_PATH . "inc/database.php");  //this instantiates a new PDO object called $db

    try {
        $results = $db->query("
                SELECT name, price, img, sku, paypal
                FROM products
                ORDER BY sku DESC
                LIMIT 4");
    } catch (Exception $e) {
        echo "Data could not be retrieved from the database. get_products_recent";
        exit;
    }

    $recent = $results->fetchAll(PDO::FETCH_ASSOC);
    $recent = array_reverse($recent);

    return $recent;
}

しかし、dbクエリがページの読み込みを大幅に遅らせていることがわかりました..

いくつかのグーグル検索の後、PDOコンストラクターに追加できる PDO::ATTR_PERSISTENT => true 属性を見つけました...そして、ページの読み込みを「通常」に高速化しました..

しかし、現実世界のシナリオでは、これは間違った/非効率的な方法ですか..? db 呼び出しを行うすべての関数呼び出し内で新しい PDO オブジェクトを作成するのではなく、PDO オブジェクトを開いて使用するより良い方法はありますか?

4

2 に答える 2

-2

通常、データベース接続クラスを作成します。通常はシングルトンです。PDO オブジェクトは、クラスの保護されたプロパティです。モデル ファイルはこのクラスを拡張します。したがって、スーパークラスを拡張するクラスによってのみアクセスできるため、安全な単一の PDO オブジェクトがあります。

準備済みステートメントを使用していますか? これにより、パフォーマンスが向上します。また、SQLI 攻撃のリスクも大幅に軽減されます。

DB パフォーマンスを最適化する際に考慮すべきその他の事項を次に示します。

  • どのストレージエンジンを使用していますか?
  • あなたのmysql構成設定は何ですか?
  • 主キーを使用していますか?
  • 複数のクエリを実行する代わりに結合を使用できますか?
  • クエリをキャッシュできますか?
  • リファクタリングできる可能性のある特に遅いクエリはありますか?

HTH -- n

于 2013-10-18T04:10:21.343 に答える