<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// コードのこの部分は、記事の内容とは何の関係もありません,たとえば、プレースホルダーのみ</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"この記事を読んでください,この記事では、使用方法について説明しますmysqli::use_result関数回避PHPメモリオーバーフローの問題。"</span></span><span>;
</span><span><span class="hljs-meta">?></span></span><span>
<hr>
</span><span><span class="hljs-meta"><?php</span></span><span>
<span class="hljs-comment">/*
* 合格する方法mysqli::use_result機能は効果的に回避されますPHPメモリオーバーフローの問題?
*
* 存在するPHP真ん中,使用MySQLデータベースの場合,クエリ結果セットが大きい場合、メモリオーバーフローに問題があることがよくあります。特に使用する場合mysqli大規模な結果セットのクエリ実行を拡張します,
* すべての結果が一度にメモリにロードされる場合,非常に簡単に引き起こしますPHPメモリが使い果たされました,プログラムのクラッシュ。
*
* mysqliクエリ結果を取得する2つの方法を提供します:store_result()そしてuse_result()。
*
* 1. store_result():
* デフォルトメソッド,会将整个结果集一次性取回并缓存存在する客户端内存真ん中。
* 大量のデータボリューム用,非常に大きなメモリ消費。
*
* 2. use_result():
* 使用"行レベル"取得方法,すべての結果を一度に取得しません,代わりに、ネットワークを介してデータを読み取ります。
* これにより、メモリの使用量が大幅に削減されます,メモリオーバーフローを避けてください。
*
* この記事では、合理的に使用する方法に焦点を当てていますmysqli::use_result()避免メモリオーバーフローの問題。
*/</span>
<span class="hljs-comment">/**
* 使用mysqli::use_resultのサンプルコード
*/</span>
</span><span><span class="hljs-variable">$mysqli</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-string">'localhost'</span></span><span>, </span><span><span class="hljs-string">'username'</span></span><span>, </span><span><span class="hljs-string">'password'</span></span><span>, </span><span><span class="hljs-string">'database'</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$mysqli</span></span><span>->connect_errno) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"接続に失敗しました: "</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>->connect_error);
}
</span><span><span class="hljs-comment">// クエリを実行します</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">real_query</span></span><span>(</span><span><span class="hljs-string">"SELECT * FROM large_table"</span></span><span>)) {
</span><span><span class="hljs-comment">// 合格use_result結果セットを取得します,大量のデータを一度にロードしないでください</span></span><span>
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">use_result</span></span><span>();
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$result</span></span><span>) {
</span><span><span class="hljs-comment">// ラインごとにデータを処理します,メモリの使用量を削減します</span></span><span>
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$row</span></span><span> = </span><span><span class="hljs-variable">$result</span></span><span>-></span><span><span class="hljs-title function_ invoke__">fetch_assoc</span></span><span>()) {
</span><span><span class="hljs-comment">// データの各行を処理します,たとえば、ファイルへの出力または書き込み</span></span><span>
</span><span><span class="hljs-comment">// echo $row['column_name'] . PHP_EOL;</span></span><span>
}
</span><span><span class="hljs-comment">// リリース結果セットリソース</span></span><span>
</span><span><span class="hljs-variable">$result</span></span><span>-></span><span><span class="hljs-title function_ invoke__">free</span></span><span>();
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"結果の取得に失敗しました:"</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>->error;
}
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"クエリに失敗しました:"</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>->error;
}
</span><span><span class="hljs-comment">// 接続を閉じます</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
<span class="hljs-comment">/*
* 詳細な説明:
*
* 1. ストリーミングリーディング:
* 使用use_result(),MySQLサーバーは一度に結果をクライアントに送信しません,代わりに、接続を維持します,
* クライアントを行ごとに読み取ります。这样避免了大量数据存在する内存真ん中积累。
*
* 2. 注意すべきこと:
* - 存在する使用use_result()時間,最初にすべての結果または呼び出しを読む必要がありますfree(),その場合にのみ、新しいクエリを実行できます。
* - 混ぜることはできませんstore_result()そしてuse_result(),接続の詰まりを避けてください。
* - ネットワーク接続を維持する必要があります,读取过程不能真ん中断。
*
* 3. パフォーマンスの比較:
* 対比store_result(),use_result()ある程度のパフォーマンスを犠牲にします(複数のネットワークインタラクションが必要です),
* しかし、メモリの使用量を大幅に削減します,大規模なデータシナリオに適しています。
*
* 4. 適用可能なシナリオ:
* - クエリの結果は非常に大きいです,一度にロードできません。
* - 結果をチャンクで処理する必要があります,ファイルに書き込む場合、ページネーションエクスポートなど。。
*
* 要約します:
* 使用mysqli::use_result()ストリーミングクエリを実装します,はい、避けてくださいPHPメモリオーバーフローの効果的な戦略。
* 開発者はラインごとにデータを取得できます,メモリピークの使用量を削減します,これにより、プログラムの安定性が向上します。
*/</span>
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
関連タグ:
mysqli