【问题标题】:How do odbc (or mysql) resources work in php?odbc(或mysql)资源如何在php中工作?
【发布时间】:2010-12-29 14:48:22
【问题描述】:

当您像这样运行查询时:

$query = "SELECT * FROM table";
$result = odbc_exec($dbh, $query);
while ($row = odbc_fetch_array($result)) {
    print_r($row);
}

$result 中存储的资源是否指向运行 php 的服务器上存在的数据?还是指向数据库中的数据?换句话说,当 while 循环完成它的事情时,PHP 是在每次迭代时都与数据库对话,还是从应用程序端的某个源中提取 $row?

这对我来说很重要的是我有一个数据库,我正在使用 ODBC 和 PHP 通过 VPN 与之交谈。上周末发生了一些奇怪的事情,在 while 循环期间发生了巨大的停顿。因此在迭代之间,脚本将停止执行几秒钟到几分钟。发生这种情况似乎是完全随机的。我想知道是否每次迭代都需要通过 VPN 与服务器通信,并且可能连接不稳定,或者我的 ODBC 驱动程序 (FreeTDS) 出现问题。

【问题讨论】:

    标签: php mysql odbc vpn freetds


    【解决方案1】:

    资源标识 PHP 用于与外部资源交互的内部数据结构。

    对于mysql_query()返回的资源,这个数据结构会包含查询返回的行(直到所有数据都返回或者连接失败才会返回)。然而,这种行为是特定于 MySQL 的——不要求 DBMS 在客户端明确请求数据之前返回数据。

    如果在您的设置中存在一些导致大量延迟的奇怪问题,那么唯一明显的解决方案是在数据库端编译查询结果,然后将它们传送到您的 PHP 代码,无论是批处理还是作为一个整体(想想网络服务)。

    C.

    【讨论】:

      【解决方案2】:

      mysql_query 和 odbc_exec 都返回一个资源,该资源(引用php.net)“是一个特殊变量,持有对外部资源的引用。”这表明服务器每次迭代都在与数据库服务器通信,不过我不确定。

      但是,我们在这里讨论的是 2 个连接。第一个是您与 PHP 服务器的连接,第二个是 PHP 服务器和数据库服务器之间的连接。如果两台服务器的连接速度都很快,那么您遇到的奇怪行为可能与您的 VPN 无关。

      【讨论】:

      • 通常情况下,多个层都有缓冲区 - 一次会发送少量数据/“行” - 但很可能不会一次性发送所有查询结果。跨度>
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-06
      相关资源
      最近更新 更多