我在让 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 的情况下解决原始问题?
- 如何解决环境问题?
我已经使用SetEnv
and PerlSetEnv
in正确设置了 DB2INSTANCE、DB2_PATH 和 SQLLIB 变量httpd.conf
,但没有运气。
注意:我已经编辑了代码以确定问题是否与全局变量持久性有关。