我在我的CentOS7服务器上正确设置unixODBC以使用我的Transoft ODBC驱动程序,我可以使用以下命令在root中成功连接和查询我尝试使用它的数据库:
isql -v 'DSN' 'user' 'pwd'
我采取了下一步并创建了一个PHP脚本来运行查询。
$connect = odbc_connect("integra.udd","user","pwd");
$query = "SELECT Company1,Product,Vendor,Description1 FROM ICMAST WHERE Company1=1 LIMIT 5";
$result = odbc_exec($connect, $query);
while(odbc_fetch_row($result)){
$product = odbc_result($result, 2);
$desc = odbc_result($result, 4);
print "\n$product $desc<br />";
}
如果我使用PHP odbctest.php
在root中执行此操作,它可以工作,我得到了我应该得到的结果。此外,我可以使用su -s /bin/bash apache
转到apache用户并运行它,它可以工作。 (我通过在PHP脚本中运行命令apache
验证了Apache服务器使用echo exec ('whoami');
作为用户)
但是,如果我去浏览器并运行它,我会收到以下错误:
Warning: odbc_connect(): SQL error: [unixODBC][Driver Manager]Can't open lib '/usr/usql/sqlaccess/libtsodbc.so' : file not found, SQL state 01000 in SQLConnect in /var/www/html/2m/odbctest.php on line 10
使用Apache运行时找不到共享对象文件,但是从任何用户运行时都是。
首先,我承担了权限问题,因此我将libtsodbc.so
文件的所有权更改为apache:apache
。没有变化。
然后我检查了文件的权限,它被设置为555
,所以应该由用户执行。
然后我尝试在浏览器中运行PHP脚本,检查该路径中是否存在该文件。这是我运行的脚本:
<?php
$filename = '/usr/usql/sqlaccess/libtsodbc.so';
if (file_exists($filename)) {
echo "The file $filename exists";
} else {
echo "The file $filename does not exist";
}
?>
它返回该文件存在,因此即使Apache正在执行脚本,PHP也可以看到它。
我放弃了它是SELinux或Firewalled的想法,因为它甚至没有达到它试图连接的程度,它在尝试查找共享对象库文件时失败了。所以问题必须是服务器内部的。
最后,我想也许这与共享库路径有关,即使它正在查看错误中文件的实际路径而未找到它。所以我尝试将以下行添加到我的PHP脚本中以设置LD_LIBRARY_PATH
:
putenv("LD_LIBRARY_PATH=/usr/usql/sqlaccess/");
没有变化,仍然会发现找不到文件错误。
我确信它很简单,因为我是一名Linux初学者,但我不知道下一步该尝试什么。有任何想法吗?运行PHP脚本的用户和运行PHP脚本的Apache之间还有什么不同?
修改以添加
libtsodbc.so
,php
和httpd
文件命令输出:
[root@intranetserver /]# file /usr/usql/sqlaccess/libtsodbc.so
/usr/usql/sqlaccess/libtsodbc.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, not stripped
[root@intranetserver /]# file /usr/bin/php
/usr/bin/php: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=70ddc88b357d818240da4d4b3db50790c7913822, stripped
[root@intranetserver /]# file /usr/sbin/httpd
/usr/sbin/httpd: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0890c878aa1d1a620d5c65d25a13d11cc2fdf96a, stripped
答案 0 :(得分:2)
看起来可能与我有点不匹配。
检查这些命令的输出。他们都应该匹配 -
file /usr/usql/sqlaccess/libtsodbc.so
file `which php` # the runtime PHP
file `which httpd` # the typical name of the apache executable
find / -name mod_php -exec file {} \;
# mod_php is the PHP module for Apache
# if you know where mod_php is on your box, you can just do
# file /path/to/mod_php