PHP 的 PDO::fetch() 运行 内存不足
PHP's PDO::fetch() running out of memory
我正在 select 从 AS400(IBM iSeries 数据库)table 获取 19 列。查询 运行 没问题,总行数少于 17,000。
但是,一旦我 运行
$row = $statement->fetch(PDO::FETCH_NUM)
PHP 运行 内存不足(512 兆)。该脚本甚至不会花一秒钟的时间崩溃 - 某些东西会立即耗尽所有内存。
我可以从不同的 table 获取更多列,总共返回 150,000 行(使用相同的 fetch() 命令)并且内存消耗保持在 stable 大约 500 KB。
然而,其他 select fetch 的一些东西完全破坏了这个过程。
我在 64 位 linux 上使用 IBM 的 iSeries ODBC 驱动程序。
对于进一步故障排除的任何建议,我们将不胜感激。
UPDATE:我已将问题隔离到导致此问题的列 - 这是一个长度为 4 的 CHARACTER 字段。打破提取的记录实际上在该字段中有一个空值.驱动程序可能对如何处理空值有一些误解。
这显然是 IBM 64 位驱动程序的一个已知问题:
https://bugs.php.net/bug.php?id=54007
代替移植错误报告中建议的修复并重新编译 PHP,可以使用变通方法,例如向可以为 null 的字段添加 IFNULL 函数调用。不完全是一个解决方案,但在 IBM 解决这个问题之前必须这样做(如果他们这样做的话)。
UPDATE:如果有人遇到这个问题,显然 iSeries odbc 驱动程序确实有这个问题(并且可能永远不会更新),有一个新的连接软件称为 IBM i Access Client,它带有更好的 ODBC 驱动程序。
有关在哪里可以找到下载的说明:http://www-01.ibm.com/support/docview.wss?uid=nas8N1010355
也许你可以这样做:
select case
when offending_field is null then 'NULL'
else offending_field end as offending_field
from TABLE_NAME where CONDITION.
我正在 select 从 AS400(IBM iSeries 数据库)table 获取 19 列。查询 运行 没问题,总行数少于 17,000。 但是,一旦我 运行
$row = $statement->fetch(PDO::FETCH_NUM)
PHP 运行 内存不足(512 兆)。该脚本甚至不会花一秒钟的时间崩溃 - 某些东西会立即耗尽所有内存。
我可以从不同的 table 获取更多列,总共返回 150,000 行(使用相同的 fetch() 命令)并且内存消耗保持在 stable 大约 500 KB。 然而,其他 select fetch 的一些东西完全破坏了这个过程。
我在 64 位 linux 上使用 IBM 的 iSeries ODBC 驱动程序。 对于进一步故障排除的任何建议,我们将不胜感激。
UPDATE:我已将问题隔离到导致此问题的列 - 这是一个长度为 4 的 CHARACTER 字段。打破提取的记录实际上在该字段中有一个空值.驱动程序可能对如何处理空值有一些误解。
这显然是 IBM 64 位驱动程序的一个已知问题: https://bugs.php.net/bug.php?id=54007
代替移植错误报告中建议的修复并重新编译 PHP,可以使用变通方法,例如向可以为 null 的字段添加 IFNULL 函数调用。不完全是一个解决方案,但在 IBM 解决这个问题之前必须这样做(如果他们这样做的话)。
UPDATE:如果有人遇到这个问题,显然 iSeries odbc 驱动程序确实有这个问题(并且可能永远不会更新),有一个新的连接软件称为 IBM i Access Client,它带有更好的 ODBC 驱动程序。
有关在哪里可以找到下载的说明:http://www-01.ibm.com/support/docview.wss?uid=nas8N1010355
也许你可以这样做:
select case
when offending_field is null then 'NULL'
else offending_field end as offending_field
from TABLE_NAME where CONDITION.