package Catalyst::Script::FastCGI; use Moose; use Data::OptList; use namespace::clean -except => [ 'meta' ]; sub _plack_engine_name { 'FCGI' } with 'Catalyst::ScriptRole'; has listen => ( traits => [qw(Getopt)], cmd_aliases => 'l', isa => 'Str', is => 'ro', documentation => 'Specify a listening port/socket', ); has pidfile => ( traits => [qw(Getopt)], cmd_aliases => [qw/pid p/], isa => 'Str', is => 'ro', documentation => 'Specify a pidfile', ); has daemon => ( traits => [qw(Getopt)], isa => 'Bool', is => 'ro', cmd_aliases => [qw/d detach/], # Eww, detach is here as we fucked it up.. Deliberately not documented documentation => 'Daemonize (go into the background)', ); has manager => ( traits => [qw(Getopt)], isa => 'Str', is => 'ro', cmd_aliases => 'M', documentation => 'Use a different FastCGI process manager class', ); has keeperr => ( traits => [qw(Getopt)], cmd_aliases => 'e', isa => 'Bool', is => 'ro', documentation => 'Log STDERR', ); has nproc => ( traits => [qw(Getopt)], cmd_aliases => 'n', isa => 'Int', is => 'ro', documentation => 'Specify a number of child processes', ); has proc_title => ( traits => [qw(Getopt)], isa => 'Str', is => 'ro', lazy => 1, builder => '_build_proc_title', documentation => 'Set the process title', ); sub _build_proc_title { my ($self) = @_; return sprintf 'perl-fcgi-pm [%s]', $self->application_name; } sub BUILD { my ($self) = @_; $self->proc_title; } # Munge the 'listen' arg so that Plack::Handler::FCGI will accept it. sub _listen { my ($self) = @_; if (defined (my $listen = $self->listen)) { return [ $listen ]; } else { return undef; } } sub _plack_loader_args { my ($self) = shift; my $opts = Data::OptList::mkopt([ qw/manager nproc proc_title/, pid => [ 'pidfile' ], daemonize => [ 'daemon' ], keep_stderr => [ 'keeperr' ], listen => [ '_listen' ], ]); my %args = map { $_->[0] => $self->${ \($_->[1] ? $_->[1]->[0] : $_->[0]) } } @$opts; # Plack::Handler::FCGI thinks manager => undef means "use no manager". delete $args{'manager'} unless defined $args{'manager'}; return %args; } around _application_args => sub { my ($orig, $self) = @_; return ( $self->listen, { %{ $self->$orig }, nproc => $self->nproc, pidfile => $self->pidfile, manager => $self->manager, detach => $self->daemon, keep_stderr => $self->keeperr, proc_title => $self->proc_title, } ); }; __PACKAGE__->meta->make_immutable; 1; =head1 NAME Catalyst::Script::FastCGI - The FastCGI Catalyst Script =head1 SYNOPSIS myapp_fastcgi.pl [options] Options: -? --help display this help and exits -l --listen Socket path to listen on (defaults to standard input) can be HOST:PORT, :PORT or a filesystem path -n --nproc specify number of processes to keep to serve requests (defaults to 1, requires -listen) -p --pidfile specify filename for pid file (requires -listen) -d --daemon daemonize (requires -listen) -M --manager specify alternate process manager (FCGI::ProcManager sub-class) or empty string to disable -e --keeperr send error messages to STDOUT, not to the webserver --proc_title set the process title =head1 DESCRIPTION Run a Catalyst application as fastcgi. =head1 SEE ALSO L =head1 AUTHORS Catalyst Contributors, see Catalyst.pm =head1 COPYRIGHT This library is free software. You can redistribute it and/or modify it under the same terms as Perl itself. =cut