作者:小石头 | 来源:互联网 | 2022-11-07 18:01
我在运行CentOS 7的虚拟机上醒来,并且尝试通过一些php使用ODBC(unixODBC)连接到Informix数据库。
我正在使用php7.0,并且已经安装了unixODBC-2.3.7并安装了notifyix sdk软件包(iif.12.10.FC12DE.linux-x86_64)。
我已经将odbc.ini和odbcinst.ini配置为:
odbcinst.ini:
[ODBC Drivers]
IBM INFORMIX ODBC DRIVER=Installed
[IBM INFORMIX ODBC DRIVER]
Driver=/opt/IBM/Informix_Software_Bundle/lib/cli/iclis09b.so
Setup=/opt/IBM/Informix_Software_Bundle/lib/cli/iclis09b.so
APILevel=1
COnnectFunctions=YYY
DriverODBCVer=03.80
FileUsage=0
SQLLevel=1
smProcessPerCOnnect=Y
odbc.ini:
[ODBC Data Sources]
informix_db=IBM INFORMIXODBC DRIVER
[informix_db]
Driver=/opt/IBM/Informix_Software_Bundle/lib/cli/iclis09b.so
Description=IBM INFORMIX ODBC DRIVER
HostName=xxx.xxx.xxx.xxx
Service=xxxx
Database=xxx
LogOnID=xxx
pwd=xxx
ServerName=xxx
Client_Locale=xxx
DB_Locale=xxx
然后,我使用以下命令设置环境变量:
export INFORMIXDIR=/opt/IBM/Informix_Software_Bundle
export INFORMIXSERVER=xxx
export LD_LIBRARY_PATH=${INFORMIXDIR}/lib/cli
我的PHP代码如下:
不幸的是,当我运行php时,出现以下错误:
[unixODBC][Driver Manager]Can't open lib '/opt/IBM/Informix_Software_Bundle/lib/cli/iclis09b.so' : file not found
我读过一个类似的问题,这可能是由于DriverVersion错误导致的,因此我在odbcinst.ini中尝试了03.80和02.70(用php和unixODBC安装的odbc)。
我对linux还是很陌生,无法确定可能导致它的其他问题是什么?也许我将环境变量设置为false?
谢谢。
编辑
在尝试以下操作之后,使用isql命令就可以了:-添加以下环境变量:- INFORMIXSQLHOSTS
CLIENT_LOCALE
DB_LOCALE
ODBCINI
ONCONFIG
添加onconfig文件并对其进行配置。-添加sqlhosts文件并对其进行配置。
仍在弄清楚如何使php代码正常工作(仍然给出相同的错误)
希望能有所帮助。
EDIT#2
通过终端运行php可以正常工作,并且我可以成功地使用先前的数据库查询notifyix数据库,只有当我通过浏览器(使用apache)调用php代码时,它才行不通。
正如某人在另一篇文章中所建议的那样,这是ls -l
在驱动程序库所在的目录中运行所产生的结果:
[root@administration-pc cli]# ls -l
total 21748
-rwxr-xr-x 3 informix informix 1865750 Jun 25 2018 iclis09b.so
-rwxrwxrwx 3 informix informix 1907069 Jun 25 2018 iclit09b.so
-rwxr-xr-x 2 informix informix 32805 Jun 25 2018 idmrs09a.so
-rw-r--r-- 2 informix informix 3595434 Jun 25 2018 libcli.a
-rw-r--r-- 2 informix informix 32864 Jun 25 2018 libdmr.a
-rw-r--r-- 2 informix informix 3595434 Jun 25 2018 libifcli.a
-rwxr-xr-x 3 informix informix 1865750 Jun 25 2018 libifcli.so
-rw-r--r-- 2 informix informix 32864 Jun 25 2018 libifdmr.a
-rwxr-xr-x 2 informix informix 32805 Jun 25 2018 libifdmr.so
-rwxr-xr-x 3 informix informix 1865750 Jun 25 2018 libixcli.so
-rwxrwxrwx 3 informix informix 1907069 Jun 25 2018 libtcli.so
-rw-r--r-- 1 informix informix 3593510 Jun 25 2018 libthcli.a
-rwxrwxrwx 3 informix informix 1907069 Jun 25 2018 libthcli.so
-rw-r--r-- 1 root root 8 Mar 13 16:22 sample.txt
而这里是phpinfo()函数的Apache的结果; 并在这里通过终端运行一个PHP的。
我也都exec('whoami')
参加了,apache返回apache
而终端返回root
。
我试图改变httpd.conf
,这样User
是root
不是apache
也让我启动Apache了。
另外,iclis09b.so
将apache 的权限更改为似乎也不起作用。
编辑#3(解决方案)
Apache显然无权访问环境变量,因此您必须向其中添加所有环境变量...
我的位于/etc/sysconfig/httpd
...
1> 小智..:
您提到的所有参考代码片段都指向Informix ODBC驱动程序的直接使用,这很好。我找不到该片段的任何问题,可能导致您收到错误。此时,我对错误文本片段[unixODBC] [Driver Manager]感到困惑。我的意思是,当应用程序直接引用Informix ODBC驱动程序时,unixODBC驱动程序管理器不应出现。您可以使用以下值尝试LD_LIBRARY_PATH吗?
export LD_LIBRARY_PATH=${INFORMIXDIR}/lib:${INFORMIXDIR}/lib/esql:${INFORMIXDIR}/lib/cli
仅供参考:由于您已经创建了DSN(带有INI文件),因此可以在PHP应用程序使用的连接字符串中指定DSN名称,例如:
"DSN=informix_db; uid=xxx; pwd=xxxx;"
如果您想尝试使用纯ODBC示例应用程序连接进行故障排除(我的意思是在PHP环境之外),那么这里是ODBC应用程序示例代码。
https://github.com/OpenInformix/ODBCExamples/blob/master/src/IfxOdbcSample1.c
https://github.com/OpenInformix/ODBCExamples/blob/master/src/odbc.ini
https://github.com/OpenInformix/ODBCExamples/blob/master/src/makefile
https://github.com/OpenInformix/ODBCExamples/blob/master/src/envc.bsh