Es posible un control mas fino del comportamiento del daemon mediante
la reescritura de un conjunto de métodos. Cada uno de esos métodos
actúa en una etapa momento determinada de la vida del servidor.
Las fases por las que pasa el servidor cuando ejecuta $self->run
son:
$self->configure_hook;
$self->configure(@_);
$self->post_configure;
$self->post_configure_hook;
$self->pre_bind;
$self->bind;
$self->post_bind_hook;
$self->post_bind;
$self->pre_loop_hook;
$self->loop;
Rutinas dentro del bucle $self->loop
:
$self->accept;
$self->run_client_connection;
$self->done;
$self->pre_server_close_hook;
$self->server_close;
El procesado de la petición del cliente consiste en las siguientes etapas:
$self->post_accept; $self->get_client_info; $self->post_accept_hook; if( $self->allow_deny && $self->allow_deny_hook ){ $self->process_request; }else{ $self->request_denied_hook; } $self->post_process_request_hook; $self->post_process_request;
Durante la fase de bajada del servicio ($self->server_close
)
se dan las siguientes etapas:
$self->close_children; # if any $self->post_child_cleanup_hook; if( Restarting server ){ $self->restart_close_hook(); $self->hup_server; } $self->shutdown_sockets; exit;
Net::Server
provee un conjunto de métodos
'hooks' que permiten influenciar en la conducta
en diferentes momentos de la ejecución de $self->run
.
En la fase mas temprana se ejecuta configure_hook . El siguiente ejemplo muestra algunos parámetros de configuración que pueden ser iniciados en ese punto:
18 sub configure_hook { 19 my $self = shift; 20 21 my $root = $self->{server_root} = "/home/pp2/public_html"; 22 23 $self->{server}->{port} = '*:8080'; # port and addr to bind 24 # $self->{server}->{user} = 'nobody'; # user to run as 25 # $self->{server}->{group} = 'nobody'; # group to run as 26 # $self->{server}->{setsid} = 1; # daemonize 27 # $self->{server}->{pid_file} = "$root/server.pid"; # pid file 28 # $self->{server}->{log_file} = "$root/server.log"; 29 30 31 $self->{document_root} = "$root/"; 32 # $self->{access_log} = "$root/access.log"; 33 # $self->{error_log} = "$root/error.log"; 34 35 $self->{default_index} = [ qw(index.html index.htm main.htm) ]; 36 37 }El método post_configure_hook se ejecuta después de la lectura de los parámetros de configuración y la creación del fichero de PID y antes de que se llame a los métodos de binding (la asignación del socket a una dirección):
pre_bind
y bind
.
En este ejemplo es usado para iniciar los ficheros de logging:
39 sub post_configure_hook { 40 use vars qw{$CRLF}; 41 $CRLF = "\015\012"; 42 43 my $self = shift; 44 45 # open(STDERR, ">>". $self->{error_log}) || die "Couldn't open STDERR: $!"; 46 # open($LOG, ">>". $self->{access_log}) || die "Couldn't open log file: $!"; 47 # autoflush $LOG 1; 48 # autoflush STDERR 1; 49 }Observe la declaración
use vars qw{$CRLF}
para hacer visible
la variable $CRLF
en el resto de las rutinas.