Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php mysqli_result是否需要活动连接来查找结果?_Php_Mysql_Mysqli - Fatal编程技术网

Php mysqli_result是否需要活动连接来查找结果?

Php mysqli_result是否需要活动连接来查找结果?,php,mysql,mysqli,Php,Mysql,Mysqli,我们注意到,对API端点的调用通常会对SELECT语句进行多个重复的MySQL查询(有时是数百个)。所以我们决定创建一个hashmap来存储 mysqli_result并检查给定查询是否已完成,然后返回保存在地图中的结果 我的问题是:mysqli\u result是否维护对我们连接的引用?这是否真的能帮助我们避免数据库中已经被不必要地请求的查询过载?如果mysqli\u结果太大,是否会使fpm进程的内存溢出 我想知道的基本上是什么方法更好: 对于查询A,每次需要时都重用mysqli\u res

我们注意到,对API端点的调用通常会对
SELECT
语句进行多个重复的MySQL查询(有时是数百个)。所以我们决定创建一个hashmap来存储
mysqli_result
并检查给定查询是否已完成,然后返回保存在地图中的结果

我的问题是:
mysqli\u result
是否维护对我们连接的引用?这是否真的能帮助我们避免数据库中已经被不必要地请求的查询过载?如果
mysqli\u结果
太大,是否会使
fpm
进程的内存溢出

我想知道的基本上是什么方法更好:

  • 对于查询A,每次需要时都重用
    mysqli\u result
    对象
  • 每次我需要的时候都要重做查询
mysqli_result()
从MySQL获取结果后,既不需要连接到MySQL,也不需要使用
mysqli
对象

警告:以上仅适用于缓冲查询。如果您使用的是未缓冲的结果集,则
mysqli_result
需要打开mysqli连接才能获取数据,否则您将收到一个错误,提示:

PHP警告:mysqli_result::fetch_all():读取中的行时出错

但是,只有在使用无缓冲查询时关闭连接时,才会出现此错误消息。e、 g

$res = $mysqli->query('SELECT id FROM Users LIMIT 1', MYSQLI_USE_RESULT);
$mysqli->close();
$res->fetch_all();
尽管在创建mysqli_result的实例时,
mysqli_result
需要一个有效的连接,但它只需要该连接即可获取数据。
mysqli\u result::\uu construct()
中的第二个参数用于决定结果集是应该在PHP中缓冲还是存储在MySQL服务器上并逐行获取。创建
mysqli\u result
的实例时,需要将
mysqli
的实例作为第一个参数传递

// Execute query on MySQL server
$res = $mysqli->real_query('SELECT id FROM Users LIMIT 1');
// Create the result object. 
// The second argument can be MYSQLI_STORE_RESULT for buffered result or MYSQLI_USE_RESULT for unbuffered.
$res = new mysqli_result($mysqli, MYSQLI_STORE_RESULT);

// If MYSQLI_STORE_RESULT was used then you can close mysqli here.
unset($mysqli); // or $mysqli->close(); or both
$data = $res->fetch_all();

// If MYSQLI_USE_RESULT was used then you can't close mysqli yet.
// unset($mysqli);
$data = $res->fetch_all();
SQL查询的缓冲是一项相当复杂的任务,最好避免重复调用,而不是实现缓存。尝试重构代码,使其在脚本执行期间不会多次调用相同的
SELECT
query

还有一个预先制作的解决方案,虽然不是很流行

并一如既往地记住:

过早优化是万恶之源


为什么需要缓冲mysqli_结果?只需缓冲数据。只有数据,没有其他。您询问的仅仅是
mysqli_result
这一事实就表明您的DB抽象类存在问题,因为
mysqli\u result
应该只是一个中间对象,不应该暴露于您的应用程序逻辑中。@达曼它不暴露于我们的应用程序逻辑您能给我们看一下您正在谈论的代码吗?你到底想做什么?我只是想知道在我们的数据库抽象上缓存一个
mysqli\u结果
对象是否可以。你不能在没有连接的情况下重用mysqli结果..如果你想多次重用数据结果。。你必须把它存放在某个地方。。(如果您不想连接,请不要在db中)谢谢@Dharman,这正是我们正在做的,但不使用此插件。我会看一看,看看如何将它添加到我们的应用程序中。@Mauríciociordano我补充了说明