1

更新: 提案されているように、serverfault にする必要があります。新しい投稿はこちら: 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 ログ ファイルに「exit signal Segmentation fault」が表示されます。

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 ビット ODBCでさらに詳しく知ることができます。

于 2012-08-10T10:23:36.190 に答える