У меня возникли проблемы с работой драйвера 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).
Запуск Apache 2.2.3, mod_perl 2.0.4 под RHEL5.
У этого парня была та же проблема, что и у меня: http://www.mail-archive.com/[email protected]/msg22909.html Но я понятия не имею, как он это исправил. Какое отношение mod_php4 имеет к mod_perl?
Любая помощь будет принята с благодарностью, мне не повезло с Google.
Обновление:
Как указал james2vegas, проблема как-то связана с PHP: я отключаю PHP все вместе, но получаю другую ошибку:
Total Environment allocation failure! Did you set up your DB2 client environment?
Я считаю, что эта ошибка связана с неправильной настройкой переменных среды, а именно DB2INSTANCE
. Однако я не могу отключить PHP, чтобы решить эту проблему (мне это нужно для некоторых устаревших приложений). Итак, у меня теперь есть 2 вопроса:
- Как я могу исправить исходную проблему, не отключая PHP целиком?
- Как решить проблему с окружением?
Я правильно установил переменные DB2INSTANCE, DB2_PATH и SQLLIB, используя SetEnv
и PerlSetEnv
в httpd.conf
, но безуспешно.
Примечание. Я отредактировал код, чтобы определить, связана ли проблема с сохраняемостью глобальных переменных.