代码之家  ›  专栏  ›  技术社区  ›  Alexander Farber

是否可以用PHP编写Apache协议处理程序?

  •  2
  • Alexander Farber  · 技术社区  · 15 年前

    我想知道是否以及如何可以用PHP为Apache 2编写一个自定义的“协议处理程序”(在自定义端口监听)?

    在C和mod_perl中,您可以编写所谓的“协议处理程序”,它拦截早期的Apache阶段(在客户端套接字连接被accept()之后,但在向其写入任何内容之前),并可以处理 FTP SMTP

    例如,我有一个简单的mod_perl处理程序,我想将它移植到PHP(比较内存使用情况-因为我的mod_perl-handler需要每个孩子有2000万个内存)。我的处理程序侦听端口843并将字符串策略写入客户端套接字:

    package SocketPolicy;
    
    # Run: semanage port -a -t http_port_t -p tcp 843
    # And add following lines to the httpd.conf
    # Listen 843
    # <VirtualHost _default_:843>
    #       PerlModule                   SocketPolicy
    #       PerlProcessConnectionHandler SocketPolicy
    # </VirtualHost>
    
    use strict;
    use warnings FATAL => 'all';
    use APR::Const(-compile => 'SO_NONBLOCK');
    use APR::Socket();
    use Apache2::ServerRec();
    use Apache2::Connection();
    use Apache2::Const(-compile => qw(OK DECLINED));
    
    use constant POLICY =>
    qq{<?xml version="1.0"?>
    <!DOCTYPE cross-domain-policy SYSTEM
    "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
    <cross-domain-policy>
    <allow-access-from domain="*" to-ports="8080"/>
    </cross-domain-policy>
    \0};
    
    sub handler {
            my $conn   = shift;
            my $socket = $conn->client_socket();
            my $offset = 0;
    
            # set the socket to the blocking mode
            $socket->opt_set(APR::Const::SO_NONBLOCK => 0);
    
            do {
                    my $nbytes = $socket->send(substr(POLICY, $offset),
                                 length(POLICY) - $offset);
                    # client connection closed or interrupted
                    return Apache2::Const::DECLINED unless $nbytes;
                    $offset += $nbytes;
            } while ($offset < length(POLICY));
    
            my $slog = $conn->base_server()->log();
            $slog->warn('served socket policy to: ', $conn->remote_ip());
            return Apache2::Const::OK;
    }
    
    1;
    

    谢谢, 亚历克斯

    4 回复  |  直到 15 年前
        1
  •  1
  •   ptomli    15 年前
        2
  •  0
  •   Wernight    15 年前

    socket extension 假设您还允许脚本运行足够长的时间。默认情况下,PHP脚本将在大约60秒后终止。

    所以主要的问题是保持PHP脚本像守护进程一样运行。

        3
  •  0
  •   Mark Baker    15 年前

    完全有可能。。。。甚至还有一个 full web server

        4
  •  0
  •   Robin    15 年前

    是的,不是。。。。PHP有一个使用Apache处理程序API的Apache接口,以及其他接口,如CLI、CGI等。PHP-Apache API集成选择不公开mod_perl那样的低级处理细节,因此如果需要访问这些回调,则必须编写自己的PHP-Apache处理程序API实现。

    推荐文章