2

DBI の IBM DB2 ドライバーを mod_perl で動作させるのに問題があります。私のテストスクリプトは次のとおりです。

#!/usr/bin/perl

use strict;
use CGI;
use Data::Dumper;
use DBI;

{
    my $q;
    my $dsn;
    my $username;
    my $password;
    my $sth;
    my $dbc;
    my $row;

    $q = CGI->new;
    print $q->header;
    print $q->start_html();

    $dsn = "DBI:DB2:SAMPLE";
    $username = "username";
    $password = "password";

    print "<pre>".$q->escapeHTML(Dumper(\%ENV))."</pre>";

    $dbc = DBI->connect($dsn, $username, $password);

    $sth = $dbc->prepare("SELECT * FROM SOME_TABLE WHERE FIELD='SOMETHING'");
    $sth->execute();
    $row = $sth->fetchrow_hashref();
    print "<pre>".$q->escapeHTML(Dumper($row))."</pre>";

    print $q->end_html;
}

このスクリプトは CGI として機能しますが、mod_perl の下では機能しません。Apache のエラー ログに次のエラーが表示されます。

DBD::DB2::dr connect warning: [unixODBC][Driver Manager]Data source name not found, and no default driver specified at /usr/lib/perl5/site_perl/5.8.8/Apache/DBI.pm line 190.
DBI connect('SAMPLE','username',...) failed: [unixODBC][Driver Manager]Data source name not found, and no default driver specified at /data/www/perl/test.pl line 15

まず、なぜ ODBC を使用しているのですか。ネイティブ DB2 ドライバーがインストールされます (したがって、CGI として機能します)。

RHEL5 で Apache 2.2.3、mod_perl 2.0.4 を実行しています。

この男は私と同じ問題を抱えていました: http://www.mail-archive.com/dbi-users@perl.org/msg22909.html しかし、彼がどのように修正したかはわかりません。mod_php4 は mod_perl と何の関係がありますか?

どんな助けでも大歓迎です、私はグーグルで運がありません。

更新

james2vegas が指摘したように、問題は PHP に関係しています。PHP をすべて無効にすると、別のエラーが発生します。

 Total Environment allocation failure! Did you set up your DB2 client environment?

このエラーは、環境変数が正しく設定されていないことに関係していると思いますDB2INSTANCE。ただし、この問題を解決するために PHP をオフにすることはできません (一部のレガシー アプリケーションでは PHP が必要です)。だから私は今2つの質問があります:

  1. PHP をすべて無効にせずに元の問題を解決するにはどうすればよいですか?
  2. 環境の問題を解決するにはどうすればよいですか?

SetEnvPerlSetEnvinを使用して、DB2INSTANCE、DB2_PATH、および SQLLIB 変数を正しく設定しましhttpd.confたが、うまくいきませんでした。

注: コードを編集して、問題がグローバル変数の永続性に関係しているかどうかを判断しました。

4

2 に答える 2

1

参考までに、これは解決されたようです。/etc/php.d/pdo_odbc.iniでPHPのODBCサポートを無効にし、環境変数を設定し、mod_perlの起動スクリプトでDBD :: DB2をプリロードします。ただし、 PERL_DL_NONLAZYを1に設定して使用することもできます。正しいライブラリを強制的にロードします。

于 2010-04-23T05:00:38.043 に答える
1

従来の DBI は mod_perl では機能しません。プロセスが分岐し、db ハンドルを再度使用しようとすると、すべて不安定になります。Apache::DBI (DBI のドロップイン代替品)を使用する必要があります。DBIx::Connectorのようなポストモダン DBI ラッパーを使用することをお勧めします。

詳細については、Apache のガイドで mod_perl をリレーショナル データベースと共に使用する を参照してください。

于 2010-04-23T00:55:31.910 に答える