Не удается подключиться к Informix через ODBC на компьютере с Linux - PullRequest
3 голосов
/ 13 марта 2019

Я просыпаюсь на виртуальной машине под управлением CentOS 7 и пытаюсь подключиться к базе данных Informix через ODBC (unixODBC) через какой-то php.

Я использую php7.0 и установилunixODBC-2.3.7, а также установил пакет informix 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

MyPHP-код выглядит следующим образом:

<?php 
$dbUserName=xxx;
$dbPassword=xxx;
$conn=odbc_connect("Driver={IBM INFORMIX ODBC DRIVER};HOSTNAME=xxx;Database=xxx;PORT=xxx;PROTOCOL=onsoctcp;", $dbUserName, $dbPassword);
 if (!$conn)
 {
    echo odbc_errormsg();
 }
 else {
    $sql="{CALL somequery}";
    $res=odbc_exec($conn,$sql);
    odbc_result_all($res);
 }
?>

К сожалению, когда я запускаю php, я получаю следующую ошибку:

[unixODBC][Driver Manager]Can't open lib '/opt/IBM/Informix_Software_Bundle/lib/cli/iclis09b.so' : file not found

Я прочитал на аналогичный вопрос , чтоЭто может быть вызвано ошибкой DriverVersion, поэтому я попробовал и 03.80, и 02.70 (odbc, установленный с php и unixODBC) внутри odbcinst.ini.

Я довольно новичок в Linux и не могу сказать, что другоепроблема может быть причиной?Может быть, я устанавливаю переменную окружения false?

Спасибо.

EDIT

Использование команды isql сработало после того, как я попробовал следующее: -Добавление следующих переменных среды: INFORMIXSQLHOSTS CLIENT_LOCALE DB_LOCALE ODBCINI ONCONFIG -Добавление файла onconfig и его настройка.-Добавление файла sqlhosts и его настройка.

Все еще выясняем, как заставить работать код php (все еще выдает ту же ошибку)

Надеюсь, это поможет.

EDIT # 2 Запуск php через терминал работает, и я могу успешно запросить базу данных informix с предыдущей базой, она не работает, только когда я вызываю код php через браузер (используя apache).

Как было предложено кем-то в другом сообщении , вот результаты, полученные при запуске 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 Ответ

5 голосов
/ 13 марта 2019

Все ссылки, которые вы упомянули, указывают на прямое использование драйвера Informix ODBC, что прекрасно.С фрагментом кода я не нашел проблем, которые могут привести к получаемой вами ошибке.В данный момент я немного озадачен фрагментом текста ошибки [unixODBC] [Driver Manager] .Я имею в виду, что диспетчер драйверов unixODBC не должен появляться, когда приложение делает прямую ссылку на драйвер ODBC Informix.Можете ли вы попробовать LD_LIBRARY_PATH со следующим значением?

export LD_LIBRARY_PATH=${INFORMIXDIR}/lib:${INFORMIXDIR}/lib/esql:${INFORMIXDIR}/lib/cli

FYI: поскольку вы создали DSN (с файлом INI), вы можете просто указать имя DSN в соединениистрока, используемая приложением PHP, например:

"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

...