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
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? –
Je n'ai jamais dit qu'il devrait être exécuté par Apache. Vous devriez probablement l'exécuter à partir du shell. – Wernight
Ok, je vais modifier ma question pour le rendre plus clair –