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

时间:2017-11-14 21:16:41

标签: php pdo odbc ibm-midrange

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

也许你可以这样做:

docker-machine start default