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



我正在从AS400(IBM iSeries数据库)表中选择19列。查询运行良好,总行数小于17000。然而,一旦我运行

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

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

我可以从不同的表中提取更多的列,总共返回150000行(使用相同的fetch()命令),内存消耗保持稳定在500KB左右。然而,另一个select fetch的某些内容完全破坏了这个过程。

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

UPDATE:我已经将问题隔离到导致此问题的列中——它是一个长度为4的CHARACTER字段。破纪录的提取实际上在该字段中有一个null。在如何处理null的问题上,驱动程序可能存在一些误解。

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

除了移植错误报告中建议的修复程序和重新编译PHP之外,还可以使用变通方法,比如向可以为null的字段添加IFNULL函数调用。不完全是一个解决方案,但在IBM弄清楚这一点之前(如果他们弄清楚的话),它必须这样做。

更新:如果有人遇到这个问题,很明显,虽然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.

相关内容

  • 没有找到相关文章

最新更新