<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提供了两种获取查询结果的方式: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