2010/3/2 Torsten Förtsch <torsten.foert...@gmx.net>:
> Not much, just a few problems solved. Comments are welcome.

Looks very cool!  I know there are a couple of hooks in APR that
aren't mapped into mod_perl space yet, such as apr_proc_create().
Have you thought about adding those to mod_perl core for a more native
and portable forking solution?

>
> NAME
>    ModPerl2::Tools - a few hopefully useful tools
>
> SYNOPSIS
>     use ModPerl2::Tools;
>
>     ModPerl2::Tools::spawn +{keep_fd=>[3,4,7], survive=>1}, sub {...};
>     ModPerl2::Tools::spawn +{keep_fd=>[3,4,7], survive=>1}, qw/bash -c .../;
>
>     ModPerl2::Tools::safe_die $status;
>     $r->safe_die($status);
>     $f->safe_die($status);
>
>     $content=ModPerl2::Tools::fetch_url $url;
>     $content=$r->fetch_url($url);
>
> INSTALLATION
>     perl Makefile.PL
>     make
>     make test
>     make install
>
> DESCRIPTION
>    This module is a collection of functions and methods that I found useful
>    when working with "mod_perl". I work mostly under Linux. So, I don't
>    expect all of these functions to work on other operating systems.
>
>  Forking off long running processes
>    Sometimes one needs to spawn off a long running process as the result of
>    a request. Under modperl this is not as simple as calling "fork" because
>    that way all open file descriptors would be inherited by the child and,
>    more subtle, the long running process would be killed when the
>    administrator shuts down the web server. The former is usually
>    considered a security issue, the latter a design decision.
>
>    There is already $r->spawn_proc_prog that serves a similar purpose as
>    the "spawn" function. However, "spawn_proc_prog" is not usable for long
>    running processes because it kills the children after a certain timeout.
>
>   Solution
>     $pid=ModPerl2::Tools::spawn \%options, $subroutine, @parameters;
>
>    or
>
>     $pid=ModPerl2::Tools::spawn \%options, @command_line;
>
>    "spawn" expects as the first parameter an options hash reference. The
>    second parameter may be a code reference or a string.
>
>    In case of a code ref no other program is executed but the subroutine is
>    called instead. The remaining parameters are passed to this function.
>
>    Note, the perl environment under modperl differs in certain ways from a
>    normal perl environment. For example %ENV is not bound to the C-level
>    "environ". These modifications are not undone by this module. So, it's
>    generally better to execute another perl interpreter instead of using
>    the $subroutine feature.
>
>    The options parameter accepts these options:
>
>    keep_fd => \...@fds
>        here an array of file descriptor numbers (not file handles) is
>        expected. All other file descriptors except for the listed and file
>        descriptor 2 (STDERR) are closed before calling $subroutine or
>        executing @command_line.
>
>    survive => $boolean
>        if passed "false" the created process will be killed when Apache
>        shuts down. if true it will survive an Apache restart.
>
>    The return code on success is the PID of the process. On failure "undef"
>    or an empty string is returned.
>
>    The created process is not related as a child process to the current
>    apache child.
>
>  Serving "ErrorDocument"s
>    Triggering "ErrorDocument"s from a registry script or even more from an
>    output filter is not simple. The normal way as a handler is
>
>      return Apache2::Const::STATUS;
>
>    This does not work for registry scripts. An output filter even if it
>    returns a status can trigger only a "SERVER_ERROR".
>
>    The main interface to enter standard error processing in Apache is
>    "ap_die()" at C-level. Its Perl interface is hidden in Apache2::HookRun.
>
>    There is one case when an error message cannot be sent to the user. This
>    happens if the HTTP headers are already on the wire. Then it is too
>    late.
>
>    The various flavors of "safe_die()" take this into account.
>
>    ModPerl2::Tools::safe_die $status
>        This function is designed to be called from registry scripts. It
>        uses Apache2::RequestUtil->request to fetch the current request
>        object. So,
>
>         PerlOption +GlobalRequest
>
>        must be enabled.
>
>        Usage example:
>
>         ModPerl2::Tools::safe_die 401;
>         exit 0;
>
>    $r->safe_die($status)
>    $f->safe_die($status)
>        These 2 methods are to be used if a request object or a filter
>        object are available.
>
>        Usage from within a filter:
>
>         package My::Filter;
>         use strict;
>         use warnings;
>
>         use ModPerl2::Tools;
>         use base 'Apache2::Filter';
>
>         sub handler : FilterRequestHandler {
>           my ($f, $bb)=...@_;
>           return $f->safe_die(410);
>         }
>
>        The filter flavor removes the current filter from the request's
>        output filter chain.
>
>  Fetching the content of another document
>    Sometimes a handler or a filter needs the content of another document in
>    the web server's realm. Apache provides subrequests for this purpose.
>
>    The 2 "fetch_url" variants use a subrequest to fetch the content of
>    another document. The document can even be fetched via "mod_proxy" from
>    another server. However, fetching a document directly as with LWP for
>    example is not (yet) possible.
>
>    "ModPerl2::Tools::fetch_url" needs
>
>     PerlOption +GlobalRequest
>
>    Usage:
>
>     $content=ModPerl2::Tools::fetch_url '/some/where?else=42';
>
>     $content=$r->fetch_url('/some/where?else=42');
>
> EXPORTS
>    None.
>
> SEE ALSO
>    <http://perl.apache.org>
>
> AUTHOR
>    Torsten Förtsch, <torsten.foert...@gmx.net>
>
> COPYRIGHT AND LICENSE
>    Copyright (C) 2010 by Torsten Förtsch
>
>    This library is free software; you can redistribute it and/or modify it
>    under the same terms as Perl itself.
>
>
> Torsten Förtsch
>
> --
> Need professional modperl support? Hire me! (http://foertsch.name)
>
> Like fantasy? http://kabatinte.net
>

Reply via email to