通过PHP7.0-FPM为ODBC连接在系统范围内更新LD_LIBRARY_PATH


Update LD_LIBRARY_PATH system wide for ODBC connection via PHP7.0-FPM

我正试图通过ODBC从Ubuntu Linux机器连接到NetSuite。我把一切都安排好了。它通过shell和PHP命令行工作。但是,当我尝试通过web请求与PHP建立连接时,它失败了,并出现以下错误:

 Warning: odbc_connect(): SQL error: [unixODBC][Driver Manager]Can't open lib '/opt/netsuite/odbcclient/lib64/ivoa25.so' : file not found, SQL state 01000 in SQLConnect in 

为了让它在shell中工作,我必须将其添加到我的.profile(通过NetSuite驱动程序附带的readme.txt)中

ODBCINI="/opt/netsuite/odbcclient/odbc64.ini"
OASDK_ODBC_HOME="/opt/netsuite/odbcclient/lib64"
LD_LIBRARY_PATH="/opt/netsuite/odbcclient/lib64${LD_LIBRARY_PATH:+":"}${LD_LIBRARY_PATH:-""}"
export ODBCINI
export OASDK_ODBC_HOME
export LD_LIBRARY_PATH

问题似乎出在设置LD_LIBRARY_PATH上。我注意到这一页的一半写着

"Note: You can only set this environment variable inside an interactive shell."

NetSuite驱动程序需要对LD_LIBRARY_PATH进行此更新,那么是否有其他选项可以发出web请求来执行我的odbc_connect()语句?

我尝试过,但失败了

  • putenv()
  • . /etc/odbcinst.ini添加到/etc/init.d/php7.0-fpm脚本
  • 添加所需的语句&导出到/etc/environment(尽管它说它不起作用)
  • /opt/netsuite/odbcclient/lib64添加到新文件/etc/ld.so.conf.d/netsuite.conf

当我完成上面列表中的最后一个时,我成功地运行了sudo ldconfig,但在尝试连接&查询(垃圾堆,但不同的错误!):

    [unixODBC]�pV�,8�(8��|D�x������H�R��ut�
(8eow�ut�(8�����|`gx�0x�pV�K����������M0�0�N��M0� ������4�
�0d��Ryy

我没有答案,但我现在无法发表评论。。。然而,我确实掌握了一些可能有用的信息。

很长一段时间以来,我一直在为这个用于Linux的NetSuite ODBC驱动程序而苦苦挣扎。我学到的一件有趣的事情是驱动程序与Ubuntu 14.02不兼容。它与12.02兼容,12.02将于2017年4月停止支持。然而,在我安装的Ubuntu 12.02虚拟机上,我仍然会遇到同样的错误。他们在2016年5月底发布了一篇关于兼容性的文章,那是在我放弃它并在Windows机器上开发之后。

当我使用ISQL时,我也遇到了同样的错误,在我的PHP代码中也遇到了相同的错误。我检测到权限设置为具有任何r和x,但它不起作用。

运行此命令时:

sudo ldd /opt/netsuite/odbcclient/lib64/ivoa25.so

我得到这个:

linux-vdso.so.1 =>  (0x00007ffebfb4b000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fcfefc08000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fcfefa04000)
libicuuc.so.42 => not found
libicudata.so.42 => not found
libpam.so.0 => /lib/x86_64-linux-gnu/libpam.so.0 (0x00007fcfef7f6000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fcfef5d8000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fcfef2d4000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fcfeefce000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fcfeedb8000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fcfee9f3000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fcff01b6000)
libaudit.so.1 => /lib/x86_64-linux-gnu/libaudit.so.1 (0x00007fcfee7cf000)

这没有意义,因为它们在目录中:

drwxr-xr-x 2 root root     4096 Jan  8  2016 .
drwxr-xr-x 8 root root     4096 Jul 28 16:45 ..
-rw-r--r-- 1 root root  1534752 Jan  8  2016 ddtrc25.so
-rw-r--r-- 1 root root   260915 Jan  8  2016 ivldap25.so
-rw-r--r-- 1 root root    12137 Jan  8  2016 ivmgan25.so
-rw-r--r-- 1 root root   124833 Jan  8  2016 ivmgapi25.so
-rw-r--r-- 1 root root   437482 Jan  8  2016 ivmghu25.so
-rw-r--r-- 1 root root     1521 Jan  8  2016 ivoa25.ini
-rwxr-xr-x 1 root root  3255664 Jan  8  2016 ivoa25.so
-rw-r--r-- 1 root root 14920460 Jan  8  2016 libddicu25.so
-rw-r--r-- 1 root root 16010036 Jan  8  2016 libicudata.so.42
-rw-r--r-- 1 root root  1608359 Jan  8  2016 libicuuc.so.42
-rw-r--r-- 1 root root   354900 Jan  8  2016 libivoa25m.so
-rw-r--r-- 1 root root  1172888 Jan  8  2016 libodbcinst.so
-rw-r--r-- 1 root root  1659688 Jan  8  2016 libodbc.so
-rw-r--r-- 1 root root  1457352 Jan  8  2016 odbccurs.so 
-rw-r--r-- 1 root root  2154752 Jan  8  2016 openssl700.so

无论"未找到"文件的权限如何,我都会得到未找到的文件。当我创建了到这些文件的符号链接时,我能够得到ivoa25.所以没有发现错误,但后来得到了这个:

Warning: odbc_connect(): SQL error: [unixODBC], SQL state in SQLConnect in/var/www/html/DataBase.php on line 5

无法连接:

关于这个错误,我联系了unixODBC.org上的人,他们说:

Its a guess, but maybe try setting ODBCINI, the driver may need that to find the ini file
export ODBCINI=/etc/odbc.ini

但那也没什么作用。。。

我很乐意帮你解决这个问题,因为它也会帮助我。。。我们应该交换意见。

更新

使用使用ISQL时错误仍然存在

$ odbcisql64 -m 0 

命令。当你运行这个时,它看起来像这样:

DataDirect OpenAccess SDK Interactive SQL (ODBC) Version 7.2
(c) Copyright 1995-2013 Progress Software Corporation. All rights reserved.
Program Locale:en_US.UTF-8
ISQL>

尝试使用连接字符串以这种方式连接

ISQL> connect "user"*"pw"@netsuite 

我也犯了同样的错误。。。

SQL: connecting to database: netsuite...
SQL: Can't connect to database netsuite
The following error information describes the failure
ODBC Call     = SQLConnect()
SQL State     = 01000
Native error  = 0(0)
Error Message = [unixODBC][Driver Manager]Can't open lib     '/opt/netsuite/odbcclient/lib64/ivoa25.so' : file not found
SQL: isql_connect() failure
Elapsed time 2 ms.
ISQL>

但是,我可以使用这个更通用的isql命令"连接"(至少看起来是连接)

$ isql NetSuite user pw 

它连接起来。这适用于Ubuntu14和Ubuntu12。但我无法让任何SQL命令工作,它看起来与其他ISQL连接结果不同

+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL>

因此,解决方案最终比预期的更简单。我基本上创建了一个bash脚本,它导出我需要的环境变量,然后运行PHP脚本。以下是我的netsuite-odbc.sh脚本的全部内容。我现在可以连接并运行查询了。

ODBCINI="/opt/netsuite/odbcclient/odbc64.ini"
OASDK_ODBC_HOME="/opt/netsuite/odbcclient/lib64"
LD_LIBRARY_PATH="/opt/netsuite/odbcclient/lib64${LD_LIBRARY_PATH:+":"}${LD_LIBRARY_PATH:-""}"
export ODBCINI
export OASDK_ODBC_HOME
export LD_LIBRARY_PATH
/usr/bin/php /home/user/netsuite-odbc.php