【问题标题】:mysqli_result class where does actual fetched data exits?mysqli_result 类实际获取的数据在哪里退出?
【发布时间】:2017-06-01 07:33:00
【问题描述】:

mysqli_query 被执行时,PHP 从数据库(MySQL)接收结果集,据我所知,它是一个对象(mysqli_result 类)。

这个 mysqli_result 类是否在其属性中携带来自数据库的实际数据?

只是想知道结果在哪里退出......

【问题讨论】:

    标签: php mysql mysqli


    【解决方案1】:

    这个 mysqli_result 类是否在其属性中携带来自数据库的实际数据?

    没有。

    它只携带一个到 internal 结果集的链接,该链接无法直接访问,但只能通过随后调用 mysqli_result::fetch_* 方法来访问。

    结果存在于Mysqli模块内部分配的内存中。它仍然在 PHP 端,但无法直接访问,但 it is occupying the memory available for PHP script(这是我关于 PDO 的文章,但它也适用于 mysqli)。

    唯一的例外是unbuffered query。对于这样的查询,PHP 端没有存储结果集,而是直接从数据库中获取结果。

    【讨论】:

    • 该“内部结果集”是否存在于内存或物理文件中的某处?
    • 我添加了一些说明
    • 不错!我不知道默认情况下查询是作为缓冲模式执行的。所以当我期待一个大的结果时,我应该使用无缓冲模式,对吧?
    • 是的,就是这样
    【解决方案2】:

    有两种类型的查询。缓冲和非缓冲。使用无缓冲查询时,数据根本不存储在 PHP 内存中。

    使用缓冲查询时,客户端库会提前从 MySQL 服务器获取数据。 Mysqli 可以使用两个客户端库:libmysql 和 mysqlnd。

    当使用 libmysqlclient 时,数据由该客户端存储在内存中。它不存储在 PHP 内存中。

    当使用mysqlnd(原生PHP扩展)时,数据由mysqlnd内部存储在PHP内存中。

    可以使用mysqli_result 类的方法访问缓冲数据,也可以使用mysqli_fetch_all 将其复制到数组中。

    Mysqli 根本不存储数据!如果数据被缓冲,它只会由客户端库存储在 PHP 内存中。

    【讨论】:

      猜你喜欢
      • 2011-06-17
      • 2018-02-07
      • 2020-11-08
      • 2013-07-11
      • 2016-04-22
      • 1970-01-01
      • 1970-01-01
      • 2018-11-07
      • 1970-01-01
      相关资源
      最近更新 更多