使用MySQLi-更好地关闭查询
时间:2020-03-05 18:42:55 来源:igfitidea点击:
我习惯将变量用法保持在最低限度。因此,我想知道以下内容是否有任何优势:
$query = $mysqli->query('SELECT * FROM `people` ORDER BY `name` ASC LIMIT 0,30'); // Example 1 $query = $query->fetch_assoc(); // Example 2 $query_r = $query->fetch_assoc(); $query->free();
现在,如果我是对的,示例1应该会更有效率,因为在重新分配它时,$ query是未设置的,这将释放与其关联的所有内存。但是有一种方法(MySQLi_Result :: free()
)可以释放关联的内存,这是同一回事吗?
如果我不调用`:: free()释放与结果相关的任何内存,而是通过重新分配变量来"取消设置"它,我是否在做同样的事情?我不知道如何记录这种事情,有人有什么想法吗?
解决方案
回答
该手册似乎建议我们仍应使用" free()"来释放内存。我相信原因是free()
释放了MySQL中的内存,而不释放了PHP中的内存。由于PHP无法为MySQL进行垃圾回收,因此我们需要调用free()
。
回答
示例1将$ query变量与MySQL结果分离。 MySQL结果仍然存在于内存中,并且将继续存在并浪费内存,直到发生垃圾回收为止。
示例2立即释放MySQL结果,释放已使用的资源。
但是,由于PHP页面通常短暂,结果集较小,因此节省的内存微不足道。除非我们在长时间运行的页面上长时间保留大量结果,否则我们不会注意到速度变慢。
布赖恩
PHP可以垃圾收集MySQL结果,只是不会立即发生。
结果存在于PHP的内存池中,而不在MySQL服务器的内存池中。
(使用无缓冲查询时,内存的位置稍有不同,但是在PHP中很少使用它们,因此不值得一提)