2011-08-24 4 views
0

가상 호스트에서 mod_perl2가 실행 중이고 서버로드를 처리하기위한 요청간에 mysql 연결을 영구히 유지하려고합니다. 주제에 관한 모든 설명서와 책을 읽었으며 mod_perl2 웹 응용 프로그램의이 베어 본 구현이 "깨졌습니다!"라고 대답하는 이유는 여전히 알 수 없습니다.왜 내 패키지 (our'd) 변수가 PerlChildInitHandler와 PerlResponseHandler (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이 어휘 적으로 범위가 지정되어있는 것처럼 보입니다. 제발, 나에게 이걸 설명 할 수 있니?

답변

0

mod_perl에서 mysql 연결 지속성을 보려면 Apache::DBI을보아야합니다. DBI의 연결과 연결을 오버로드하여 DBI->connect(...)을 정상적으로 사용할 수있게 해주 며 mod perl 환경에서 작동하거나 작동하지 않는 코드의 이점을 추가합니다.

스코핑 문제에 관한 한, mp 설정에 대한 피드백이 더 필요합니다. 나는 use vars '$mysql_handle' 또는 심지어 $Test::mysql_handle = DBI->connect(...)을 시도하고 당신이 찾고있는 결과를 얻지 못하면보십시오.

관련 문제