0

私の質問は、MySQL のデータに基づいて PHP でオブジェクトを作成すると、データが二重に保存され、リソースが浪費され、アプリケーションが遅くなるのではないでしょうか?

  1. ユーザーが新しい製品に切り替えるたびにデータベースにクエリを実行していないため、MySQL データをオブジェクトとしてキャッシュして高速アクセスを可能にするために、これを行うだけですか?
  2. それほど複雑でないコードに対してのみ行うのでしょうか?
  3. 小さな MVC でこれを処理する適切な方法は何ですか? つまり、セッションの開始時に、モデルはすべての製品の配列を作成する必要がありますか? すべての製品の配列が存在することはなく、毎回データベースに問い合わせて、このデータを毎回新しい Product オブジェクトに変換する必要がありますか?

よろしければ、私が質問している理由を読み進めてください...

これは私のアプリケーションのサイズにとって実際には問題ではないことがわかりましたが、正しく開始したいと思います。作成した基本的な小さな MVC と、製品と呼ぶ項目のデータベースがあります。便宜上、MySQL データから PHP オブジェクトに移動するかどうか、いつ、どこに移動するかを決定しようとしています。

これは私のファイルツリーがどのように見えるかです:

root
    controller
        Controller.php
    model
        Model.php
        Product.php
    view
        Products.php
        Product.php
    index.php

関連するコードは次のとおりです。

// Controller.php
if (!isset($_GET['product'])) {
    - getProducts() && include view/Products
} else {
    - getProduct('product') && include view/Product
}

// Model.php
getProducts() {
    while($row = $stmt->fetch_assoc()) {
        $array[$i] = new Product($row["id"], $row["name"], $row["price"]);
        $i++;
    }
    return $array;
}
getProduct($id) {
    $allProducts = $this->getProducts();
    return $allProducts[$id];
}

// Products view
<?php foreach ($products as $product): ?>
    display $product->id and $product->name
<?php endforeach; ?>

// Product view
display $product->name and $product->description and $product->price ...
4

2 に答える 2

3

技術的にはデータベース内のデータをメモリに複製しますが、レストランでメニューを読むとメニュー項目が自分のメモリに複製されるのと同じ方法です。メニューから何かを注文する方法がないのと同じように、データを使用するスクリプトのためにメモリに読み込まずに、データベースからデータを利用または処理する方法はありません。そして、おそらく食事の終わりまでにほとんどのメニューを思い出すことができないのと同じように (メニューが不要になった後は忘れてしまいます)、スクリプトの実行が終了すると、PHP はメモリに何も保持しません。スクリプトが終了します。

必要のないデータをメモリに読み込まないことをお勧めします。たとえば、users テーブル全体ではなく、必要な 1 つのユーザー レコードを検索します。独自のシナリオを評価するには、独自のベンチマークを実行する必要がありますが、一般的に言えば、必要なデータのみを取得するために、(適切なインデックスを使用する WHERE 句を使用して) 小規模なクエリを繰り返し実行することをお勧めします。大規模なクエリを使用して、必要な場合と不要な場合がある大量のデータを取得します。

于 2013-05-08T19:36:56.523 に答える
2

あなたは大きな誤解をしています。PHP はデーモン環境ではありません。つまり、非常に特殊なセットアップを使用しない限り、オブジェクトはクライアント インスタンス間で保存または共有されません。デフォルトでは、PHP は機能します。最初から最後まで指示に従って進み、完了すると終了してシャットダウンします。

これは、製品、たとえば DB の ID 4 が PHP メモリ内にある間だけ使用されることを意味します。デフォルトでは、何かが参照を使い果たした瞬間に、PHP はその設定を解除します。したがって、製品モデルのインスタンスがあり、それを使用してから設定を解除するとします。ほら、メモリから消えてしまいました。

たとえば、コードを考えてみましょう。コントローラーでは、 を呼び出していますgetProduct。製品が見つかり、返却され、コントローラが完了した瞬間にアンセットされます。これにより、1 つの SQL クエリが発生しました。これは 2 重ストレージの形式ですが、古い手続き型の MySQL コード スタイルを使用するよりも決して要求が厳しいわけではありません。

モデル自体は、それ自体がデータの表現です。これにより、すべてのデータベース構造を抽象化して、意味があり、より論理的で、さらに重要なことに、キャッシュ、転送、および取得が容易な形式にすることができます。これは、ストレージの 2 番目の形式ではありません。「翻訳」と考えてください。

上記からの答えを推測します:

  1. キャッシュを有効にしますが、これは良い副作用です。彼らは主に保守性、コードの読みやすさ、および引数に依存性注入風のフォーマットを簡単かつ適切に使用するためにそれを行います
  2. はい。複雑さが軽減され、保守が容易になり、使いやすく、拡張しやすくなります
  3. モデルにはゲッターが必要です。または、モデルのロケーターを作成する必要があります。これは同じ目的です。ID を与えると、使用したい DB またはキャッシュ エンジンにクエリを実行してモデルが返されます。これを構築する方法がわからない場合は、既に作成されているツールを使用してください。最近のほとんどのフレームワークにはこれがあります。Laravel と Symfony は、物事をどのように行うべきかを示す 2 つの非常に良い例です。

最後に、1 つ説明していただけますか? MySQL からデータをメモリに保存せずに取得する方法を教えてください。PHP にはテレパシーがありません。

于 2013-05-08T19:18:13.390 に答える