我有一个 Debian 服务器(64 位),我想通过 PHP 将其连接到 AS400 的数据库。我已经安装了 IBM i Access for Linux 和 unixodbc。我已经遵循了这个教程:https://www.albertopicado.es/conexion-odbc-con-base-de-datos-db2-en-un-servidor-ibm-iseries/虽然是西班牙语,但你可以看到我遵循的过程。
问题是我可以建立一个简单的连接,例如:
$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_prepare,如下所示:
$query="SELECT * FROM DATABASE.TABLE WHERE ID=1;
$result=odbc_prepare($as400,$query);
这会引发致命错误:允许的内存大小 1048576000 字节已耗尽(尝试分配 140707423584261 字节)。
我已将 php.ini 文件上的 memory_limit 值增加到 1000M,但它仍然抛出相同的错误。我一直在网上冲浪,发现有人在使用 64 位版本时遇到问题,如下帖子所示:Linux odbc 致命错误:允许的内存大小但我正在执行的查询没有任何空值。
Info
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 为空。
EDIT
看到 iSeriesAccess Driver x64 可能有一些错误,我最终将其卸载。然后我安装了 iSeriesAccess 驱动程序 x32。在安装新驱动程序之前,我制作了 Debian 多架构并下载了 ia32-libs(因为 iSeriesAccess 驱动程序 x32 缺少一些软件包)。
使用新驱动程序时,我收到另一个错误:
警告:odbc_connect():SQL 错误:[unixODBC][驱动程序管理器]无法打开 lib '/opt/ibm/iSeriesAccess/lib/libcwbodbc.so':未找到文件,SQLConnect 中的 SQL 状态 01000。
我已经仔细检查了 lib 'libcwbodbc.so' 是否存在。我还针对该库运行命令 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)
正如您所看到的,没有丢失库。我缺少什么?
SOLUTION
最后,我安装了 32 位版本的 Debian。在我看来,问题在于 64 位版本的 IBM I Access 驱动程序。我只是按照新安装的相同步骤操作,它就像一个魅力。希望它对其他人有帮助。