用于查询unixODBC的PHP脚本在浏览器中失败但在Linux命令提示符下工作

时间:2016-08-18 19:19:24

标签: php apache odbc centos7

我在我的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.sophphttpd文件命令输出:

[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

1 个答案:

答案 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