2017-02-09 143 views
2

我有一個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的問題。我只是按照新安裝中的相同步驟操作,它就像魅力一樣。希望它可以幫助別人。

+0

您使用的是什麼PHP版本? (我不知道這是否相關,但是如果你遇到特定的已知問題,指定它可能會有所幫助) – Simba

+0

我使用PHP 5.6.29 – Sergi

+0

當您嘗試鏈接中的建議時發生了什麼你發佈了嗎?編輯問題以顯示嘗試過的內容和結果。 – user2338816

回答

0

這是#21286589的複製品。僅僅因爲你沒有NULL值並不意味着你在使用錯誤匹配的ABI時不會遇到問題。

這裏的問題是,舊的驅動程序只設置32位的64位指標值,PHP讀取整個64位。這裏PHP的值爲140707423584261,十六進制爲0x7FF900000005。你可以看到最後4個字節是0x00000005這是5,應該是返回的實際數據的長度。剩下的部分是垃圾,因爲驅動程序沒有更改這些字節。

正如我在我的回答中提到的Linux odbc Fatal error: Allowed memory size,您需要從IBM i Access Client解決方案Linux應用程序包中獲取新的ODBC驅動程序。該驅動程序遵循unixODBC自2.2.14以來使用的完整64位ABI。新的驅動程序包還包含Debian .deb軟件包,因此幾乎所有您引用的博客中的所有步驟都不再需要。

相關問題