web-dev-qa-db-ja.com

mysqli_free_resultが必要ですか?

コードを調べていたところ、結果オブジェクトが不要になったときに mysqli_free_result を使用することをお勧めしました。しかし、各クエリがスクリプト全体で繰り返し$result変数に出力されるのを確認した後、mysqli_free_resultが本当に必要かどうか疑問に思います。クエリが実行されるたびに、$result変数が既に消去され、新しい結果に設定されているようです。誰かがこれについて何か意見を持っているかどうかだけ興味があります。

20
JoJo

厳密に必要になることは決してありませんが、使用しているリソースを監視し、それらが不要になったときを知ることをお勧めします。

その余分なコード行をドロップするのはごくわずかな労力なので、結果セットが完成するたびにそれを実行します。リソースを使い終わったときに、コードを読んでいる人にわかりやすくするという追加のボーナスがあります。

8
Michael Mior

多くのリクエストが行われるとサーバーに大きな負荷がかかる可能性があるため、実際には必要です。したがって、できればそれを使用する必要があります。

このクエリの後に他のクエリが続くことがわかっているため、使用する必要がない場合もあります。

8

コードが乱雑になっています。これは、mysqli_free_resultを削除する機能ベースの理由ではありませんが、私の意見では正当な理由です。以下のスニペットを検討してください。

単一のレコードのフェッチクエリを解放することで、多くのメモリを節約することはできません。必要なことを知っている-一部のスクリプトが割り当て可能なメモリよりも多くのメモリを使用している場合を除いて、それらをスキップします(めったにないはずです)。

これらのリソースを解放するもう1つの理由は、開いているファイルハンドルの量に対するOSレベルの制限です。ただし、すべてのクエリは、この1つの接続または1つのファイルハンドルまたはソケットを経由すると思います。


 // Share PDF
 if ($_REQUEST['do'] == 'sharePDF') {
-   $sql = "SELECT * FROM c_document WHERE doc_id = $doc_id";
-   $res = mysql_query($sql);
-   $doc_row = mysql_fetch_assoc($res);
-   mysql_free_result($res);
-   $d_name = $doc_row['d_name'];
-   $templ_id = $doc_row['templ_id'];
-   $sql = "SELECT * FROM c_template WHERE templ_id = $templ_id";
-   $res = mysql_query($sql);
-   $templ_row = mysql_fetch_assoc($res);
-   mysql_free_result($res);
+
+   $doc_row = qAssocOne("SELECT * FROM c_document WHERE doc_id = $doc_id");
+   $templ_row = qAssocOne("SELECT * FROM c_template WHERE templ_id = {$doc_row['templ_id']}") ;
+
    $params = array(
        'share_pdf_core_id='.$templ_row['share_pdf_core_id'],
        'share_pdf_create_id='.$templ_row['share_pdf_create_id'],
@@ -193,7 +187,7 @@ if ($_REQUEST['do'] == 'sharePDF') {
        'doc_id='.intval($_REQUEST['doc_id']),
        'pdf1='.urlencode($_REQUEST['pdf']),
        'pdf2=',
-       'name='.urlencode($d_name),
+       'name='.urlencode($doc_row['d_name']),
        'select_output='.$templ_row['select_output']
     );
    $params = join("&",$params);

私の意見では、減算された行は絶対的なゴミです。10行対2行です。お願いします...


あなたの常識からのコメントに応えて:

関数が何をするかを気にする必要はありません。ポイントを示しています。さらに、名前はあなたにヒントを与えます。クエリの場合はQ、数値配列ではなくハッシュのフェッチ(ハイドレイト)の場合はAssocOneは、レコードのセットではなく、1つのレコードに対して。それが何をするのか本当に推測できない場合は、オンラインで検索してください。コードが利用可能です。グーグルで最初にヒット。

それは無関係ではありません。多くのPHPコードは次のようになります。私のポイントは答えに記載されています。そうです 1行で結果セットをクリアしても多くのメモリを節約できないため、不要です。 。それはコードを乱雑にし、意図またはビジネスロジックを難読化するため不要です。

have-Nice-day