sql >> データベース >  >> RDS >> Mysql

Mysqliで結果を閉じるのはなぜですか

    接続が失敗したかどうかのチェックは、接続を使用するコードにフォールスルーします。ライブ接続ではないため、明らかにそれは機能しません。接続に失敗した場合、それに依存するコードに到達しないようにしてください。 (exitまたはdieの使用を推奨する必要はないことに注意してください。ユーザーエクスペリエンスがかなり悪くなる可能性があります。便利な場合もありますが、理想的には、より適切なメッセージを出力し、ログに醜いエラーを残す必要があります。テストのみ、またはコマンドラインスクリプトです])。

    close()(実際にはfree()のエイリアス)について:

    free()は基本的に、結果に添付されているすべてのものの割り当てを解除します。行を取得する方法は2つあることを理解する必要があります。

    バッファリング-すべてが一度に奪われます。つまり、レコードのループを開始するまでに、レコードはすべて実際にはすでにメモリ内にあります。それらはバッファリングされます 。 fetch()を呼び出すたびにサーバーからプルされるのではなく、メモリからプルされます。

    バッファリングされていない-小さなバッファがある場合がありますが、基本的に、fetch()を呼び出すたびに、PHPはデータベースから新しい行をプルする必要があります。ループの開始時に、それらはすべてメモリ内にあるわけではありません。

    興味深い注意:num_rows()は、すべての行がすでにプルされているため、バッファリングされたクエリで非常に効率的に呼び出すことができます(ただし、カウントするためだけにすべての行をプルすることはできません。これがCOUNTの目的です)。バッファリングされていないクエリは、すべての行をプルするまでnum_rows()を実行できません。つまり、エラーになるか、本質的にバッファリングされたクエリになります。

    とにかく、実際の質問に戻りましょう:

    free()は、結果オブジェクトに関連付けられているものをすべて解放します。バッファリングされたクエリの場合、これはメモリ内にある任意の行です。バッファリングされていないクエリの場合、free()はメモリ内にある可能性のあるすべての行を解放してから、残りのリクエストをキャンセルします。基本的に、そのPHPはMySQLに、「私が要求するすべての行を知っていますか?気が変わった。その要求を削除するだけでよい」と言っています。

    結果を解放する必要があるかどうかについては...まあ、変数がスコープ外になると*、とにかく発生します。ただし、明示的に実行しても害はありません。クエリが大量のメモリを使用し、その後に大量のメモリを使用した後に別のクエリを実行する場合は、メモリ使用量を低く抑えるためにセットを解放することをお勧めします。 。

    *または、リクエストが終了したとき。頭のてっぺんから覚えていません。




    1. SpotlightCloudをセットアップしてSQLServerを効率的にトラブルシューティングする方法

    2. List<>をSQLストアドプロシージャに渡す

    3. フィルタされたインデックスを追加することの予期しない副作用

    4. MySQL/MariaDBサーバーにアクセスするための上位5つのソフトウェアアプリケーション