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

可以用PHP编写Apache协议处理程序吗?,php,apache2,mod-perl,Php,Apache2,Mod Perl,我想知道是否以及如何能够在PHP中为Apache2编写一个自定义的“协议处理程序”(在自定义端口侦听) 在C和mod_perl中,您可以编写所谓的“协议处理程序”,它可以拦截早期Apache阶段(在客户机套接字连接被accept()加密之后,但在任何内容被写入之前),例如可以处理或协议。在PHP中也可以吗 例如,我有以下简单的mod_perl处理程序,我想将其移植到PHP(以比较内存使用情况——因为我的mod_perl处理程序需要每个孩子2000万)。我的处理程序在端口843侦听并将字符串策略写

我想知道是否以及如何能够在PHP中为Apache2编写一个自定义的“协议处理程序”(在自定义端口侦听)

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

例如,我有以下简单的mod_perl处理程序,我想将其移植到PHP(以比较内存使用情况——因为我的mod_perl处理程序需要每个孩子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;
package-SocketPolicy;
#运行:semanage port-a-t http_port_t-ptcp 843
#并将以下行添加到httpd.conf
#听着
# 
#PerlModule插座政策
#PerlProcessConnectionHandler套接字策略
# 
严格使用;
使用警告致命=>“全部”;
使用APR::Const(-compile=>'SO_NONBLOCK');
使用APR::Socket();
使用Apache2::ServerRec();
使用Apache2::Connection();
使用Apache2::Const(-compile=>qw(OK));
使用常量策略=>
qq{
\0};
副处理器{
我的$conn=班次;
my$socket=$conn->client_socket();
我的$offset=0;
#将套接字设置为阻塞模式
$socket->opt_set(APR::Const::SO_NONBLOCK=>0);
做{
我的$nbytes=$socket->send(substr(策略,$offset),
长度(保单)—$offset);
#客户端连接已关闭或中断
返回Apache2::Const::拒绝,除非$n字节;
$offset+=$n字节;
}而($offsetbase_server()->log();
$slog->warn($conn->remote_ip());
返回Apache2::Const::OK;
}
1.
谢谢,
Alex

从技术上讲,是的,在给定的条件下,您可以这样做,因为您还允许脚本运行足够长的时间。默认情况下,PHP脚本将在大约60秒后终止


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

这是完全可能的。。。。甚至还有一个用PHP编写的

不,mod_PHP没有像mod_perl那样实现Apache处理程序阶段


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

Yes,但它不是Apache2模块。nanoweb是一个用PHP编写的守护进程。然而,我想问的是,如何编写一个Apache 2处理程序,它将不处理通常的内容生成阶段,而是像mod_ftp()这样的协议阶段,它将在端口843侦听。好的,您建议一个hack:编写一个PHP脚本,它将由Apache 2运行(但何时?),并将绑定一个在端口843侦听的套接字。我不确定这是否有效,我正在寻找其他东西:在C和mod_perl中,您可以编写Apache“协议处理程序”(例如处理FTP或SMTP)。我的问题是:如果你也能在PHP中运行它,我从来没有说过它应该由Apache运行。您可能应该从shell运行它。正如您所说的“所以主要问题是保持PHP脚本像守护进程一样运行。”使用Servlet是可能的。我说得对吗?????我仍然喜欢PHP提供持久数据库连接和套接字的方式-使用mod_perl或C,您需要更多的工作来实现它们。@Robin:PHP使用CGI接口与Apache通信吗???与其他Perl、c和其他编程语言一样。