为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
手掌心 2023-07-08 22:13:43
我们注意到,对 API 端点的调用通常有多个重复的 MySQL 语句查询SELECT(有时是数百个)。因此,我们决定创建一个哈希图来存储 mysqli_result并检查给定的查询是否已经完成并返回保存在地图中的结果。我的问题是:是否mysqli_result维护对我们连接的引用?这实际上会帮助我们避免数据库因已经不必要地请求的查询而超载吗?如果mysqli_result太大,我们的进程的内存是否会溢出fpm?我基本上想知道什么方法更好:对于查询 A,mysqli_result每次需要时重用对象;每次需要时重做查询 A。
查看完整描述

1 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

mysqli_result()mysqli从 MySQL 获取结果后,既不需要连接到 MySQL,也不需要对象。


注意:以上内容仅适用于缓冲查询。如果您使用无缓冲的结果集,则mysqli_result需要打开 mysqli 连接来获取数据,否则您将收到一条错误消息:


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


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


$res = $mysqli->query('SELECT id FROM Users LIMIT 1', MYSQLI_USE_RESULT);

$mysqli->close();

$res->fetch_all();

尽管mysqli_result在创建它的实例时需要有效的连接,但它只需要该连接来获取数据。中的第二个参数用于mysqli_result::__construct()决定结果集是应该在 PHP 中缓冲还是存储在 MySQL 服务器上并逐行获取。当您创建 的实例时,mysqli_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尝试重构您的代码,以便在脚本执行期间不会多次调用相同的查询。

还有一个预制的解决方案,尽管不是很受欢迎。Mysqlnd查询结果缓存插件

一如既往地记住:

过早的优化是万恶之源


查看完整回答
反对 回复 2023-07-08
  • 1 回答
  • 0 关注
  • 87 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信