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

时间:2010-10-22 13:44:13

标签: php apache2 mod-perl

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

在C和mod_perl中,您可以编写所谓的“协议处理程序”,它拦截早期的Apache阶段(在客户端套接字连接被接受()之后,但在任何内容写入之前)并且可以示例处理FTPSMTP协议。在PHP中也可以吗?

例如,我有以下简单的mod_perl处理程序,我想将其移植到PHP(比较内存使用情况 - 因为我的mod_perl-handler每个子项需要20m)。我的处理程序在端口843处侦听并将字符串POLICY写入客户端套接字:

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 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

技术上是的,您可以使用socket extension,因为您还允许脚本运行足够长的时间。默认情况下,PHP脚本将在60秒后终止。

因此,主要问题是让PHP脚本像守护进程一样运行。

答案 2 :(得分:0)

完全有可能....甚至还有一个用PHP编写的full web server

答案 3 :(得分:0)

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