Parametrización del Servidor

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:

  1. $self->configure_hook;
  2. $self->configure(@_);
  3. $self->post_configure;
  4. $self->post_configure_hook;
  5. $self->pre_bind;
  6. $self->bind;
  7. $self->post_bind_hook;
  8. $self->post_bind;
  9. $self->pre_loop_hook;
  10. $self->loop; Rutinas dentro del bucle $self->loop:
    1. $self->accept;
    2. $self->run_client_connection;
    3. $self->done;
  11. $self->pre_server_close_hook;
  12. $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;

Hooks: Reescribiendo configure_hook

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.



Subsecciones
Casiano Rodríguez León
Licencia de Creative Commons
Programación Distribuida y Mejora del Rendimiento
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=44.
2012-06-19