Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php odbc_prepare出现致命错误:允许的内存大小已耗尽_Php_Ibm Midrange_Unixodbc - Fatal编程技术网

Php odbc_prepare出现致命错误:允许的内存大小已耗尽

Php odbc_prepare出现致命错误:允许的内存大小已耗尽,php,ibm-midrange,unixodbc,Php,Ibm Midrange,Unixodbc,我有一个Debian服务器(64位),我想通过PHP将其连接到AS400的数据库。我已经安装了IBM I Access for Linux和unixodbc。我遵循了本教程:虽然它是西班牙语的,但您可以看到我遵循的过程。 问题是我可以建立一个简单的连接,如: $server= 'DRIVER={DRIVER_NAME};DATABASE=DATABASENAME;SYSTEM=IP;HOSTNAME=IP;PORT=NUMBER_OF_THE_PORT;PROTOCOL=TCPIP;'; $as

我有一个Debian服务器(64位),我想通过PHP将其连接到AS400的数据库。我已经安装了IBM I Access for Linux和unixodbc。我遵循了本教程:虽然它是西班牙语的,但您可以看到我遵循的过程。 问题是我可以建立一个简单的连接,如:

$server= 'DRIVER={DRIVER_NAME};DATABASE=DATABASENAME;SYSTEM=IP;HOSTNAME=IP;PORT=NUMBER_OF_THE_PORT;PROTOCOL=TCPIP;';
$as400= odbc_connect($server, "username", "password");
$as400 ? echo "ok" : echo "ko";
此返回“ok”,因此我了解连接已建立。然后我做一个简单的odbc准备,如下所示:

$query="SELECT * FROM DATABASE.TABLE WHERE ID=1;
$result=odbc_prepare($as400,$query);
这会引发致命错误:允许的内存大小为1048576000字节,已用尽(尝试分配140707423584261字节)

我已经将php.ini文件上的memory_limit的值增加到1000M,它仍然抛出相同的错误。我一直在网上冲浪,我发现人们在64位版本上有问题,就像这篇文章中所说的:但是我执行的查询没有任何空值

信息

odbcinst-j命令:

DRIVERS............: /usr/local/etc/odbcinst.ini
SYSTEM DATA SOURCES: /usr/local/etc/odbc.ini
FILE DATA SOURCES..: /usr/local/etc/ODBCDataSources
USER DATA SOURCES..: /root/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
odbcinst.ini:

[iSeries Access ODBC Driver]
Description=iSeries Access for Linux ODBC Driver
Driver=/opt/ibm/iSeriesAccess/lib64/libcwbodbc.so
Setup=/opt/ibm/iSeriesAccess/lib64/libcwbodbcs.so
NOTE1=If using unixODBC 2.2.11 or later and you want the 32 and 64-bit ODBC drivers to share DSN's,
NOTE2=the following Driver64/Setup64 keywords will provide that support.
Driver64=/opt/ibm/iSeriesAccess/lib64/libcwbodbc.so
Setup64=/opt/ibm/iSeriesAccess/lib64/libcwbodbcs.so
Threading=2
DontDLClose=1
UsageCount=2

[iSeries Access ODBC Driver 64-bit]
Description=iSeries Access for Linux 64-bit ODBC Driver
Driver=/opt/ibm/iSeriesAccess/lib64/libcwbodbc.so
Setup=/opt/ibm/iSeriesAccess/lib64/libcwbodbcs.so
Threading=2
DontDLClose=1
UsageCount=1
odbc.ini为空

编辑 看到iSeries Access驱动程序x64可能有一些bug,我最终卸载了它。然后我安装了iSeries访问驱动程序x32。在安装新的驱动程序之前,我制作了Debian multiarch,并下载了ia32 libs(因为iSeries Access驱动程序x32缺少一些软件包)

对于新的驱动程序,我遇到了另一个错误:
警告:odbc_connect():SQL错误:[unixODBC][Driver Manager]无法打开lib'/opt/ibm/iSeriesAccess/lib/libcwbodbc.so':未找到文件,SQLConnect中的SQL状态为01000

我仔细检查了libcwbodbc.so库是否存在。我还对lib运行命令ldd,查看是否缺少某些内容:

linux-gate.so.1 (0xf7763000)
libcwbcore.so => /opt/ibm/iSeriesAccess/lib/libcwbcore.so (0xf7557000)
libodbcinst.so.1 => /usr/lib/i386-linux-gnu/libodbcinst.so.1 (0xf7544000)
libdl.so.2 => /lib/i386-linux-gnu/i686/cmov/libdl.so.2 (0xf753e000)
libpthread.so.0 => /lib/i386-linux-gnu/i686/cmov/libpthread.so.0 (0xf7522000)
libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xf7430000)
libm.so.6 => /lib/i386-linux-gnu/i686/cmov/libm.so.6 (0xf73ea000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xf73cd000)
libc.so.6 => /lib/i386-linux-gnu/i686/cmov/libc.so.6 (0xf721f000)
librt.so.1 => /lib/i386-linux-gnu/i686/cmov/librt.so.1 (0xf7216000)
libltdl.so.7 => /usr/lib/i386-linux-gnu/libltdl.so.7 (0xf720a000)
/lib/ld-linux.so.2 (0xf7766000)
正如您所看到的,没有缺少LIB。我错过了什么

解决方案 最后,我安装了32位版本的Debian。在我看来,这个问题依赖于64位版本的IBM I Access驱动程序。我只是在新安装上遵循同样的步骤,它就像一个魅力。希望它能帮助其他人。

这是《21286589》的翻版。仅仅因为您没有
NULL
值并不意味着您在使用不匹配的ABI时不会遇到问题

这里的问题是,旧驱动程序只设置64位指示符值中的32位,PHP读取整个64位。在这里,PHP看到值140707423584261,它是十六进制的
0x7FF900000005
。您可以看到最后4个字节是
0x00000005
,它是5,应该是返回的实际数据的长度。其余部分是垃圾,因为驱动程序没有更改这些字节


正如我在对的回答中提到的,您将需要从IBM I Access Client Solutions Linux应用程序包中获取新的ODBC驱动程序。此驱动程序遵循unixODBC自2.2.14以来使用的完整64位ABI。新的驱动程序包还包含Debian.deb包,因此您引用的博客中的几乎所有步骤都不再需要。

您使用的PHP版本是什么?(我不知道这是否相关,但如果你遇到了一个特定的已知问题,指定它可能会有帮助)我使用的是PHP 5.6.29当你尝试在你发布的链接中的建议时发生了什么?编辑问题以显示尝试的内容和结果。可能存在重复的问题