1

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

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

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

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

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 error.log 条目

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

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

更新 2:

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

if(!$odbc = odbc_connect("exchequer","username","password")) { die("连接到 Exchequer 失败"); } $rows = odbc_exec($odbc,'SELECT sl.slStockCode, sl.slQtyInStock, sl.slQtyAllocated, sl.slLocCode FROM StockLocation sl WHERE sl.slLocCode IN (\'DIG\',\'WOO\',\'MEN \')'); 回声“

“.print_r($rows,true)。”
";

odbc_connect 工作(不会死),但我在浏览器中一直看到错误 342,并且在 apache 日志文件中看到“退出信号分段错误”。

4

1 回答 1

1

它可能只是您正在使用的组件之一中的错误,但我最好的猜测是您的组件在编译时与 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,那么它们会匹配,所以奇怪的是你需要询问他们的 Pervasive 驱动程序。

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

您可以在64-bit ODBC中找到更多相关信息

于 2012-08-10T10:23:36.190 回答