Почему переменные моего пакета (нашего) очищаются между PerlChildInitHandler и PerlResponseHandler в mod_perl2? - PullRequest
0 голосов
/ 24 августа 2011

У меня запущен mod_perl2 на виртуальном хосте, и я пытаюсь сделать постоянное соединение MySQL между запросами на обработку нагрузки на сервер. Я прочитал всю документацию и книгу по этой теме, и я до сих пор не знаю, почему эта «голая» реализация веб-приложения mod_perl2 отвечает «Это сломано!».

package Test;

use strict;
use warnings;
use Apache2::Const;
use Carp qw{croak};
use DBI;

our $mysql_handle;

sub handler {
    print "Content-Type: text/plain\n\n";
    print (defined $mysql_handle ? "It's defined!" : "It's broken!");
    return Apache2::Const::OK;
}

sub child_init {
    my ($db, $host, $port, $user, $pass)
      = qw{app_db localhost 3306 app_user app_pass};
    $mysql_handle
      = DBI->connect("dbi:mysql:database=$db;host=$host;port=$port", $user, $pass)
      or croak("Failed to establish a connection with mysqld: $DBI::errstr");
    return Apache2::Const::OK;
}

1;

Это очень странно и не имеет никакого смысла для меня. Как будто $ mysql_handle имеет лексическую область видимости - когда это не так! Пожалуйста, кто-нибудь может мне это объяснить?

1 Ответ

0 голосов
/ 04 января 2012

Вы должны посмотреть на Apache :: DBI , чтобы узнать об устойчивости соединения mysql в mod_perl. Он перегружает соединения и разъединения DBI, что позволяет вам использовать DBI->connect(...) в обычном режиме, с дополнительным преимуществом кода, работающего в среде mod perl или вне ее.

Что касается проблемы с областью видимости, мне нужно немного больше отзывов о вашей настройке mp. Я бы попробовал use vars '$mysql_handle' или даже $Test::mysql_handle = DBI->connect(...) и посмотрел бы, не получили ли вы результаты, которые вы ищете.

...