我想知道是否以及如何在PHP中爲Apache 2編寫自定義「協議處理程序」(監聽自定義端口)?是否有可能在PHP中編寫Apache協議處理程序?
在C和mod_perl中,您可以編寫所謂的「協議處理程序」,它攔截早期的Apache階段(在客戶端套接字連接已被接受()之後,但在任何內容已被寫入之前)例如處理FTP或SMTP協議。它也可以在PHP中使用嗎?例如,我有以下簡單的mod_perl處理程序,我想將它移植到PHP(以比較內存使用情況 - 因爲我的mod_perl處理程序需要每個子項20米)。我的處理程序會偵聽端口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;
謝謝, 亞歷克斯
好的,你建議一個黑客:編寫一個PHP腳本,它將由Apache 2運行(但何時?),並綁定一個偵聽端口843的套接字。我不確定這會工作,我正在尋找對於別的東西:在C和mod_perl中,你可以編寫Apache「協議處理程序」(例如處理FTP或SMTP)。我的問題是:如果你可以在PHP中做到這一點? – 2010-10-22 14:39:29
我從來沒有說過它應該由Apache運行。你應該可以從shell運行它。 – Wernight 2010-10-22 14:40:38
好吧,我會編輯我的問題,使其更清晰 – 2010-10-22 14:42:08