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つの質問があります:
- PHP をすべて無効にせずに元の問題を解決するにはどうすればよいですか?
- 環境の問題を解決するにはどうすればよいですか?
SetEnv
とPerlSetEnv
inを使用して、DB2INSTANCE、DB2_PATH、および SQLLIB 変数を正しく設定しましhttpd.conf
たが、うまくいきませんでした。
注: コードを編集して、問題がグローバル変数の永続性に関係しているかどうかを判断しました。