2010-10-22 70 views
2

我想知道是否以及如何在PHP中爲Apache 2編寫自定義「協議處理程序」(監聽自定義端口)?是否有可能在PHP中編寫Apache協議處理程序?

在C和mod_perl中,您可以編寫所謂的「協議處理程序」,它攔截早期的Apache階段(在客戶端套接字連接已被接受()之後,但在任何內容已被寫入之前)例如處理FTPSMTP協議。它也可以在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; 

謝謝, 亞歷克斯

回答

0

技術上是可以的,你可在給定的socket extension,你也讓你的腳本運行足夠長的時間。默認情況下,PHP腳本將在60秒左右後終止。

所以主要問題是讓你的PHP腳本像守護進程一樣運行。

+0

好的,你建議一個黑客:編寫一個PHP腳本,它將由Apache 2運行(但何時?),並綁定一個偵聽端口843的套接字。我不確定這會工作,我正在尋找對於別的東西:在C和mod_perl中,你可以編寫Apache「協議處理程序」(例如處理FTP或SMTP)。我的問題是:如果你可以在PHP中做到這一點? – 2010-10-22 14:39:29

+0

我從來沒有說過它應該由Apache運行。你應該可以從shell運行它。 – Wernight 2010-10-22 14:40:38

+0

好吧,我會編輯我的問題,使其更清晰 – 2010-10-22 14:42:08

0

這是完全可能的....甚至還有一個full web server用PHP編寫的

+1

是的,但它不是Apache 2模塊。 nanoweb是用PHP編寫的守護進程。然而,我在問,如何編寫一個不處理通常的內容生成階段的Apache 2處理程序,而是像mod_ftp(http://httpd.apache.org/mod_ftp/)那樣的協議階段執行並且將在端口上進行監聽843 – 2010-10-22 14:33:44

0

是的,沒有.... PHP有它使用了Apache處理程序API,以及其它接口,如CLI,CGI Apache的接口等。PHP的Apache API集成選擇不公開像mod_perl這樣的底層處理細節,所以如果你需要訪問這些回調函數,你必須編寫你自己的PHP Apache處理程序API實現。

+0

我仍然喜歡PHP提供持久的數據庫連接和套接字 - 使用mod_perl或C,您需要更多工作來實現它們。 – 2010-10-24 12:05:03

+0

@Robin:PHP是否使用CGI接口與Apache通信?像其他Perl,C和其他Proramming語言一樣。 – hardik 2011-08-31 04:43:30

相關問題