【问题标题】:PHP's PDO::fetch() running out of memoryPHP 的 PDO::fetch() 内存不足
【发布时间】:2018-04-27 23:10:21
【问题描述】:

我从一个 AS400(IBM iSeries 数据库)表中选择 19 列。查询运行良好,总行数少于 17,000。 但是,一旦我运行

$row = $statement->fetch(PDO::FETCH_NUM)

PHP 内存不足(512 兆)。脚本甚至不需要一秒钟就崩溃 - 某些东西会立即耗尽所有内存。

我可以从不同的表中获取更多列,总共返回 150,000 行(使用相同的 fetch() 命令),并且内存消耗保持在 500 KB 左右。 然而,关于其他选择提取的某些东西完全消灭了这个过程。

我在 64 位 Linux 上使用 IBM 的 iSeries ODBC 驱动程序。 任何有关进一步故障排除的建议将不胜感激。

更新:我已将问题隔离到导致此问题的列 - 它是一个长度为 4 的 CHARACTER 字段。打破提取的记录实际上在该字段中有一个空值。可能是驱动程序对如何处理空值有一些误解。

【问题讨论】:

  • 你在用$row做什么?
  • PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 设置为什么? php.net/manual/en/mysqlinfo.concepts.buffering.php
  • 您确定表中没有占用大量内存的列?一些存储在 blob 或类似文件中的二进制对象?
  • @Don'tPanic 对此无能为力 - php 在该行的内存不足。
  • @erg,好主意,但列只是 varchars、小数和整数

标签: php pdo odbc ibm-midrange


【解决方案1】:

这显然是 IBM 64 位驱动程序的一个已知问题: https://bugs.php.net/bug.php?id=54007

代替移植错误报告中建议的修复并重新编译 PHP,可以使用解决方法,例如向可能为空的字段添加 IFNULL 函数调用。不完全是一个解决方案,但在 IBM 解决这个问题之前必须这样做(如果他们这样做的话)。

更新:如果有人遇到这个问题,显然 iSeries odbc 驱动程序确实存在这个问题(并且可能永远不会更新),有一个名为 IBM i Access Client 的新连接软件它带有更好的工作 ODBC 驱动程序。

在哪里可以找到下载的说明:http://www-01.ibm.com/support/docview.wss?uid=nas8N1010355

【讨论】:

    【解决方案2】:

    也许你可以这样做:

    select case 
       when offending_field is null then 'NULL' 
       else offending_field end as offending_field
       from TABLE_NAME where CONDITION.
    

    【讨论】:

      猜你喜欢
      • 2015-08-13
      • 2016-03-11
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      • 2014-11-05
      • 2018-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多