3

重複の可能性:
準備されたステートメントは、PHP を使用して複数のページが読み込まれる間、サーバー側でキャッシュされますか?

私は新しいプロジェクトに取り組んでおり、パラメーター化されたクエリを初めて使用しています (PHP と MySQL DB)。パラメータ化されたクエリがキャッシュされていることを読みましたが、キャッシュされている期間が気になります。たとえば、ユーザー テーブルからすべてのアクティブなユーザー ID のリストを取得する関数「getAllUsers()」があり、ID ごとにユーザー オブジェクトが作成され、関数「getUser($user)」が呼び出されるとします。オブジェクトの他のプロパティを設定するために作成されました。「getUser()」関数には、関数の最後に stmt->close() を持つ独自の準備済みクエリがあります。

このようにすると、'getUser()' のパラメーター化されたクエリはキャッシュをまったく利用できますか、それとも stmt->close() のたびにクエリがキャッシュから破棄されますか?

注: ページが 1 つのユーザー オブジェクトのデータのみを必要とする場合も getUser() 関数を使用するので、ユーザー テーブルが変更された場合にクエリを 1 つだけ更新する必要があることを確認するために、この方法で実行したいと考えました。

これはこのようなことをする正しい方法ですか、それとももっと良い方法がありますか?

更新: 興味深いことに、php.net の準備済みステートメントのマニュアル ( http://php.net/manual/en/mysqli.quickstart.prepared-statements.php )でこれを見ました。

準備済みステートメントを使用することが、ステートメントを実行する最も効率的な方法であるとは限りません。一度だけ実行される準備されたステートメントは、準備されていないステートメントよりも多くのクライアントとサーバーのラウンドトリップを引き起こします。

したがって、パラメーター化されたクエリの主な利点は、SQL インジェクションから保護することであり、一度に繰り返されるクエリでない限り、必ずしも高速化することではないと思います。

4

2 に答える 2

3

呼び出しmysqli_stmt::closeは:

準備済みステートメントを閉じます。mysqli_stmt_close() は、ステートメント ハンドルの割り当ても解除します。

したがって、ステートメントのキャッシュされたバージョンを以降の実行に使用することはできません。リソースを解放したり、ステートメントを閉じたりすることは気にしません。PHP がスクリプトの最後でそれをやってくれるからです。

また、(説明したように)ループを使用している場合は、準備されたステートメントを元の状態にリセットするmysqli_stmt::resetを見てください(準備呼び出しの後)。

于 2012-12-20T04:40:00.253 に答える
0

ある観点からすると、それは良い質問です。

まず、「キャッシング」について。
準備されたクエリには特別なことがいくつかあります。サーバーに一度送信してから、複数回実行することができます。すでに解析および準備されたクエリを使用することで、理論上のわずかなメリットが得られます。
どうやら、すべてのクエリを準備するたびに、そのようなメカニズムを使用しているわけではありません。したがって、キャッシュはまったくありません。

次に、時期尚早の最適化について。
あなたはいくつかのキャッシングについて聞いたことがあり、それはあなたの想像力を占領しました。
キャッシングやパフォーマンスの問題について心配する必要や原因はありませんが。

したがって、ルールがあります。パフォーマンスの問題が現実のものになるまで、パフォーマンスの問題に専念しないでください。
そうでなければ、あなたはあなたの時間を無駄にするでしょう。

于 2012-12-20T06:30:28.260 に答える