2

PHP で Apache 2 用のカスタム「プロトコル ハンドラ」(カスタム ポートでリッスンする) を作成できるかどうか、またどのように作成できるか疑問に思っています。

C および mod_perl では、いわゆる「プロトコル ハンドラ」を記述できます。これは、Apache の初期段階 (クライアント ソケット接続が accept() された後、コンテンツが書き込まれる前) をインターセプトし、たとえばFTPを処理できます。またはSMTPプロトコル。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

4 に答える 4

1

いいえ、mod_php は mod_perl が行う Apache ハンドラ フェーズを実装しません。

http://svn.php.net/viewvc/php/php-src/branches/PHP_5_3/sapi/apache2handler/php_functions.c?revision=296107&view=markup#l516を参照してください。

于 2010-10-22T15:05:38.540 に答える
0

技術的にはそうです。スクリプトを十分に長く実行することもできるので、ソケット拡張を使用できます。デフォルトでは、PHPスクリプトは60秒ほどで終了します。

したがって、主な問題は、PHPスクリプトをデーモンのように実行し続けることです。

于 2010-10-22T13:47:43.850 に答える
0

それは完全に可能です.... PHPで書かれた完全なWebサーバーさえあります

于 2010-10-22T14:09:39.423 に答える
0

はい、いいえ.... PHP には、CLI、CGI などの他のインターフェースと同様に、Apache ハンドラー API を使用する Apache インターフェースがあります。したがって、これらのコールバックにアクセスする必要がある場合は、独自の PHP Apache ハンドラー API 実装を作成する必要があります。

于 2010-10-22T15:15:37.643 に答える