- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一些关于使用 MySQLi 查询和相关内存管理的问题。
假设我有这样的东西:
$db = new mysqli($dbhost, $un, $ps, $dbname);
$query = "SELECT field1, field2 FROM table1 ";
$results = $db->query($query);
while ($result = $results->fetch_object()) {
// Do something with the results
}
$query = "SELECT field1, field2 FROM table2 ";
// question 1
$results = $db->query($query);
while ($result = $results->fetch_object()) {
// Do something with the second set of results
}
// Tidy up, question 2
if ($results) {
$results->free();
}
if ($db) {
$db->close();
}
// Question 3, a general one
因此,根据上面代码中的注释,这是我的问题:
当我将第二个查询的结果分配给 $results
时,与先前结果关联的内存会发生什么变化?我应该在分配新结果之前释放该结果吗?
关于 1,当我最后清理时,只清理最后的结果就够了吗?
当我尝试清理一个结果时,我应该像上面那样释放它,我应该关闭它,还是两者兼而有之?
我问问题 3 因为 the PHP documentation for mysqli::query
有一个使用 close 的示例,即使 close 不是 mysqli_result
的一部分(参见上面链接中的示例 1)。相比之下,我的普通 PHP 引用文本使用 free
(PHP 和 MySQL Web 开发,第四版,Welling 和 Thomson)。
最佳答案
When I assign the results of thesecond query to
$results
, what happensto the memory associated with theprevious results?
当你执行这个时:
$results = $db->query($query);
如果之前在 $results
中存在某些内容,则无法再访问此旧内容,因为没有留下对它的引用。
在这种情况下,PHP 会将变量的旧内容标记为“不再需要”——当 PHP 需要一些内存时,它将从内存中删除。
这至少对于一般 PHP 变量是正确的;但是,对于 SQL 查询的结果,一些数据可能会保存在驱动程序级别的内存中——PHP 对此没有太多控制权。
Should I be freeing that result beforeassigning the new one?
我从不这样做。
Related to 1, when I do clean up atthe end, is cleaning up just the lastresults enough?
脚本结束时:
因此,在脚本结束时,确实不需要释放结果集。
When I do try to clean up a result,should I be freeing it as above,should I be closing it, or both?
如果您关闭与数据库的连接(按照您的建议使用 mysqli::close
),这将断开您与数据库的连接。
这意味着如果您想进行其他查询,则必须重新连接!这一点都不好(需要一些时间,资源,...)
一般来说,在我确定不再需要它之前,我不会关闭与数据库的连接——这意味着我不会在脚本结束之前断开连接。
而“脚本结束”的意思是“连接将被关闭”,即使您没有指定它;我几乎从不自己关闭连接。
关于php - MySQLi 查询结果 : When do I close, 免费,还是两者兼而有之?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2417834/
这个问题已经有答案了: php, mysql - Too many connections to database error (6 个回答) 已关闭 8 年前。 伙计们,我的 opencart 网站
这是我想要的,但不能让它与新的 MySQLi 一起工作,只是因为我的主机没有所有新的 php 等... 但是一定有某种解决方案,或者这就是 MYSQLI 能做的? 请不要谈论 PDO,因为即使是丑陋的
这个问题在这里已经有了答案: Is there a way to see a prepared query as it will be executed on the database? [dupli
Warning: mysqli::query(): Couldn't fetch mysqli in C:\Program Files (x86)\EasyPHP-DevServer-13.1VC9\
Warning: mysqli::query(): Couldn't fetch mysqli in C:\Program Files (x86)\EasyPHP-DevServer-13.1VC9\
Warning: mysqli::query(): Couldn't fetch mysqli in C:\Program Files (x86)\EasyPHP-DevServer-13.1VC9\
如何在扩展类中实现 mysqli? 我正在上传图像并将其存储在 MySQL 数据库中,但出现此错误: Notice: Undefined variable: mysqli in ...ecc/ecc/
我终于切换到 mysqli 了。 但是我发现了显着的性能差异。 我有一个脚本,可以进行大约 25.000 个查询。该脚本使用 mysqli 和 mysqlnd 作为驱动程序需要 15 秒10 秒使用
这个问题已经有答案了: Why can't I run two mysqli queries? The second one fails [duplicate] (2 个回答) 已关闭 4 年前。 我
这个问题已经有答案了: mysqli::query(): Couldn't fetch mysqli (4 个答案) 已关闭 6 年前。 这是我当前的代码: query("SELECT * FROM
这个问题在这里已经有了答案: What to do with mysqli problems? Errors like mysqli_fetch_array(): Argument #1 must
我正在尝试连接到我的数据库,但当我使用 127.0.0.1 而不是本地主机时出现错误。 Warning: mysqli::mysqli(): (HY000/2002): A connection at
使用 WHM 更新 mysql 后我的网站面临这个问题。 Warning: mysqli::mysqli(): Headers and client library minor version mis
我试图通过 MySQLi 将简单数据插入到我的 MySQL 表中,但是它拒绝插入,并且没有报告任何错误消息。 我想强调的是,当直接输入 PhpMyAdmin 时,此查询功能正常(当然,替换了变量) r
我正在使用用户断言函数,例如: debug_assert ( gettype($ob)=='object', "Not an object " .print_r($ob
我有一个每天只有大约 100 人访问的站点,但是当我以用户身份登录时收到此错误消息: Warning: mysqli::mysqli() [mysqli.mysqli]: (42000/1203):
我创建了一个 foreach 循环来将数据添加到 MySQL 数据库,但在将第一行添加到数据库后,我收到错误“mysqli::query(): Couldn't fetch mysqli”。 PHP
我正在使用 mysqli 实现一些基本的 getter 函数,并且正在考虑一种在错误检查中变得懒惰但仍然正确的方法。 所以我写了这种类型的代码段 if(!mysqli_stmt_bind_param(
我已经阅读了在线 php 手册,但我仍然不确定这两个函数的工作方式:mysqli::commit 和 mysqli::rollback。 我要做的第一件事是: $mysqli->autocommit(
这个问题在这里已经有了答案: What is the difference between single-quoted and double-quoted strings in PHP? (7 个答
我是一名优秀的程序员,十分优秀!