我有一個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/雖然它是西班牙語,你可以看到我所遵循的過程。 的事情是,我可以像一個簡單的連接:odbc_prepare給出致命錯誤:允許的內存大小用盡
$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 Fatal error: Allowed memory size但我正在執行的查詢沒有任何空值。
信息
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是空白。
編輯
眼看也許iSeriesAccess驅動程序的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)
正如你所看到的那樣,沒有缺失的庫。我錯過了什麼?
解決方案
最後,我安裝了Debian的32位版本。因爲它看起來依賴於64位版本的IBM I Access Driver的問題。我只是按照新安裝中的相同步驟操作,它就像魅力一樣。希望它可以幫助別人。
您使用的是什麼PHP版本? (我不知道這是否相關,但是如果你遇到特定的已知問題,指定它可能會有所幫助) – Simba
我使用PHP 5.6.29 – Sergi
當您嘗試鏈接中的建議時發生了什麼你發佈了嗎?編輯問題以顯示嘗試過的內容和結果。 – user2338816