PHP的PDO :: fetch()内存不足

问题描述 投票:0回答:2

我从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字段。打破提取的记录实际上在该字段中为空。可能是驱动程序对如何处理空值的一些误解。

php pdo odbc ibm-midrange
2个回答
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


0
投票

也许你可以这样做:

select case 
   when offending_field is null then 'NULL' 
   else offending_field end as offending_field
   from TABLE_NAME where CONDITION.
© www.soinside.com 2019 - 2024. All rights reserved.