2010-10-22 5 views
2

Je me demande si et comment il est possible d'écrire un "gestionnaire de protocole" personnalisé (écoute sur un port personnalisé) pour Apache 2 en PHP? En C et mod_perl, vous pouvez écrire ce que l'on appelle des «gestionnaires de protocole», qui interceptent la première phase d'Apache (après qu'une connexion de socket client a été acceptée (mais avant que tout le contenu n'y soit écrit) et puissent par exemple, gérer les protocoles FTP ou SMTP. Est-ce possible en PHP aussi? Par exemple, j'ai le gestionnaire simple mod_perl suivant, que je voudrais porter sur PHP (pour comparer l'utilisation de la mémoire - puisque mon mod_perl-handler a besoin de 20m par enfant). Mon gestionnaire écoute sur le port 843 et écrit la chaîne POLITIQUE à la prise du client:Est-il possible d'écrire un gestionnaire de protocole Apache en PHP?

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; 

Merci, Alex

Répondre

0

Techniquement oui, vous pouvez le socket extension étant donné que vous aussi vous permettre de script à exécuter assez longtemps . Par défaut, un script PHP sera terminé après 60 secondes. Donc, le problème principal est de garder votre script PHP en cours d'exécution comme un démon.

+0

Ok, vous suggérez un hack: écrire un script PHP qui serait exécuté par Apache 2 (mais quand?) Et qui lierait une socket en écoutant le port 843. Je ne suis pas sûr que cela fonctionne et je cherche pour autre chose: dans C et mod_perl vous pouvez écrire des "gestionnaires de protocole" Apache (par exemple pour gérer FTP ou SMTP). Et ma question est: si vous pouvez le faire aussi en PHP? –

+0

Je n'ai jamais dit qu'il devrait être exécuté par Apache. Vous devriez probablement l'exécuter à partir du shell. – Wernight

+0

Ok, je vais modifier ma question pour le rendre plus clair –

0

Il est parfaitement possible .... il y a même un full web server écrit en PHP

+1

Oui, mais ce n'est pas un module Apache 2. Le nanoweb est un démon écrit en PHP. Je demande cependant comment écrire un gestionnaire Apache 2 qui ne traiterait pas l'étape habituelle de génération de contenu, mais une étape de protocole comme mod_ftp (http://httpd.apache.org/mod_ftp/) et qui écouterait au port 843. –

0

Oui et non .... PHP dispose d'une interface Apache qui utilise l'API de gestionnaire Apache, ainsi que d'autres interfaces, telles que la CLI, CGI, etc. L'intégration de l'API PHP Apache choisit de ne pas exposer les détails de gestion de niveau inférieur comme le fait mod_perl, donc si vous avez besoin d'accéder à ces callbacks, vous devrez écrire votre propre implémentation de l'API PHP Apache handler.

+0

J'aime toujours la façon dont PHP offre des connexions et des sockets de base de données persistants - avec mod_perl ou C vous avez besoin de plus de travail pour les implémenter. –

+0

@Robin: PHP utilise CGI Interface pour communiquer avec Apache ??? comme d'autres Perl, c, et d'autres langues Proramming le font. – hardik

Questions connexes