无处不在的 SQL 驱动程序


Pervasive SQL Driver

>UPDATE:应该按照建议在服务器故障上。新帖子: https://serverfault.com/questions/451220/psql-64bit-driver-error

我很难让 PHP 使用普遍的 SQL 驱动程序与 ODBC 连接。

我有一个 Ubuntu 服务器 12.04,并从这里安装了 64 位 PSQL 客户端驱动程序:http://www.pervasivedb.com/psqlv11/Pages/PSQL-v11-Linux-Downloads.aspx

我已经将我的ODBC.ini DSN设置到我的数据库,我可以愉快地连接然后运行查询:

isql Exchequer

当我使用 PHP 时,odbc_connect看起来不错并给了我一个资源,但是odbc_exec(调用驱动程序的点)然后完全失败(SEG 错误):

[Fri Aug 10 11:05:50 2012] [notice] child pid 13770 exit signal Segmentation fault (11)

我做错了什么?

更新:

这是 gdb 的输出

(gdb) run /var/www/default/scripts/stock/index.php
Starting program: /usr/bin/php5 /var/www/default/scripts/stock/index.php
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
[New Thread 0x7fffecc89700 (LWP 14514)]
[Thread 0x7fffecc89700 (LWP 14514) exited]
Halt[Inferior 1 (process 14513) exited normally]
(gdb) bt
No stack.

和 PHP 错误.log条目

[Fri Aug 10 15:24:53 2012] [notice] child pid 14510 exit signal Segmentation fault (11)

我还添加了跟踪/跟踪文件,但我似乎没有将任何输出保存到日志文件中。

更新 2:

这是我正在运行的简化脚本:

if(!$odbc = odbc_connect("excuquer","username","password")) { die("与国库的连接失败");}$rows = odbc_exec($odbc,'SELECT sl.slStockCode, sl.slQtyInStock, sl.slQtyAssigned , sl.slLocCode FROM StockLocation sl WHERE sl.slLocCode in ('''dig','''woo''','''men''')');echo "

".print_r($rows,true)."
";

该odbc_connect工作(不会死亡),但我在浏览器中不断看到错误 342,并在 apache 日志文件中看到"退出信号分段错误"。

它可能只是您正在使用的组件之一中的错误,但我最好的猜测是您的组件在编译时与 SQLLEN/SQLULEN 的大小不匹配。您可以在 unixODBC 中启用日志记录,它可能会给我们一个提示。编辑 odbcinst.ini 文件并将以下内容添加到顶部:

[ODBC]
Trace=yes
TraceFile=/tmp/unixodbc.log

如果您不知道哪个 odbcinst.ini 文件,您需要编辑运行 odbcinst -j,它会告诉您。现在运行你的PHP脚本,上面的文件应该包含日志。

或者,您可以在调试器(gdb)下运行php,看看它在哪里失败。为此,您需要找到 php 可执行文件的位置并运行类似以下内容:

gdb /path/to/php

然后键入"run/path/to/my/php/script",当它落在类型"bt"上时,会得到一个回溯跟踪,这将告诉我们它落在哪里。

但是,如果是SQLLEN/SQLULEN不匹配,则可能会发生损坏,这可能意味着它在与问题所在完全不同的地方出现错误。您需要验证 PHP 的 ODBC 模块、unixODBC 和您的 ODBC 驱动程序都是使用相同大小的 SQLLEN 和 SQLULEN 构建的。我猜如果你从 Ubuntu 安装了 unixODBC 和 PHP,那么它们会匹配,所以奇怪的一个将是你需要问他们的普遍驱动程序。

odbcinst -j 输出 unixODBC 构建时使用的 SQLLEN/SQLULEN 的大小。

您可以在 64 位 ODBC 中找到有关此内容的更多信息