(PECL event >= 1.2.6-beta)
EventHttp::accept β ΠΠ°ΡΡΠ°Π²Π»ΡΠ΅Ρ HTTP-ΡΠ΅ΡΠ²Π΅Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Π½Π° Π·Π°Π΄Π°Π½Π½ΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ΅ ΡΠΎΠΊΠ΅ΡΠ° ΠΈΠ»ΠΈ ΡΠ΅ΡΡΡΡΠ°
ΠΠ°ΡΡΠ°Π²Π»ΡΠ΅Ρ HTTP-ΡΠ΅ΡΠ²Π΅Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Π½Π° Π·Π°Π΄Π°Π½Π½ΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ΅ ΡΠΎΠΊΠ΅ΡΠ° ΠΈΠ»ΠΈ ΡΠ΅ΡΡΡΡΠ°. ΠΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΈΡΡ ΡΠΎΠΊΠ΅Ρ ΠΊ ΠΏΡΠΈΡΠΌΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΉ.
ΠΠ΅ΡΠΎΠ΄ Π²ΡΠ·Π²Π°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π·, ΡΡΠΎΠ±Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Π½Π° ΡΠ°Π·Π½ΡΡ ΡΠΎΠΊΠ΅ΡΠ°Ρ .
ΠΠ°ΠΌΠ΅ΡΠ°Π½ΠΈΠ΅:
ΠΠ΅ΡΠΎΠ΄ EventHttp::bind() ΠΏΡΠΈΠ²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΠΎΠΊΠ΅Ρ, ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΈΡ ΡΠΎΠΊΠ΅Ρ Π² ΡΠ΅ΠΆΠΈΠΌ
listenΠ΄Π»Ρ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΉ ΠΈ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Π½Π° ΡΠΎΠΊΠ΅ΡΠ΅ ΡΠ΅ΡΠ΅Π· ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ²acceptΠ² ΠΎΠ΄Π½ΠΎΠΌ Π²ΡΠ·ΠΎΠ²Π΅. ΠΠ΅ΡΠΎΠ΄ EventHttp::accept() Π²ΡΠ·ΡΠ²Π°ΡΡ, ΡΠΎΠ»ΡΠΊΠΎ Π΅ΡΠ»ΠΈ ΡΠΎΠΊΠ΅Ρ ΡΠΆΠ΅ Π³ΠΎΡΠΎΠ² ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ.
socket
Π Π΅ΡΡΡΡ ΡΠΎΠΊΠ΅ΡΠ°, ΠΏΠΎΡΠΎΠΊΠΎΠ²ΡΠΉ ΠΈΠ»ΠΈ ΡΠΈΡΠ»ΠΎΠ²ΠΎΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠ°ΠΉΠ»Π°, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ ΡΠΎΠΊΠ΅Ρ, Π³ΠΎΡΠΎΠ²ΡΠΉ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ.
Π€ΡΠ½ΠΊΡΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ true, Π΅ΡΠ»ΠΈ Π²ΡΠΏΠΎΠ»Π½ΠΈΠ»Π°ΡΡ ΡΡΠΏΠ΅ΡΠ½ΠΎ, ΠΈΠ»ΠΈ false, Π΅ΡΠ»ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ΠΎΡΠΈΠ±ΠΊΠ°.
ΠΡΠΈΠΌΠ΅Ρ #1 ΠΡΠΈΠΌΠ΅Ρ ΡΠ°Π±ΠΎΡΡ ΠΌΠ΅ΡΠΎΠ΄Π° EventHttp::accept()
<?php
$base = new EventBase();
$http = new EventHttp($base);
$addresses = [
8091 => "127.0.0.1",
8092 => "127.0.0.2",
];
$i = 0;
$socket = array();
foreach ($addresses as $port => $ip) {
echo $ip, " ", $port, PHP_EOL;
$socket[$i] = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!socket_bind($socket[$i], $ip, $port)) {
exit("ΠΡΠΈΠ±ΠΊΠ° socket_bind\n");
}
socket_listen($socket[$i], 0);
socket_set_nonblock($socket[$i]);
if (!$http->accept($socket[$i])) {
echo "ΠΡΠΈΠ½ΡΡΡ Π½Π΅ ΡΠ΄Π°Π»ΠΎΡΡ\n";
exit(1);
}
++$i;
}
$http->setCallback("/some-page", function () {
echo "(some-page)\n";
echo "URI: ", $req->getUri(), PHP_EOL;
$req->sendReply(200, "OK");
echo "OK\n";
});
$http->setDefaultCallback(function ($req) {
echo "URI: ", $req->getUri(), PHP_EOL;
$req->sendReply(200, "OK");
echo "OK\n";
});
$signal = Event::signal($base, SIGINT, function () use ($base) {
echo "ΠΠΎΠΉΠΌΠ°Π»ΠΈ SIGINT. ΠΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ...\n";
$base->stop();
});
$signal->add();
$base->dispatch();
echo "ΠΊΠΎΠ½Π΅Ρ\n";
// ΠΡ Π½Π΅ Π·Π°ΠΊΡΡΠ²Π°Π»ΠΈ ΡΠΎΠΊΠ΅ΡΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΌΠΎΠ΄ΡΠ»Ρ Libevent
// ΡΠΆΠ΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ» ΡΠ»Π°Π³ΠΈ CLOSE_ON_FREE ΠΈ CLOSE_ON_EXEC
// Π² Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ΅ ΡΠ°ΠΉΠ»Π°, ΡΠ²ΡΠ·Π°Π½Π½ΠΎΠΌ Ρ ΡΠΎΠΊΠ΅ΡΠ°ΠΌΠΈ.
?>ΠΡΠ²ΠΎΠ΄ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ° Π±ΡΠ΄Π΅Ρ ΠΏΠΎΡ ΠΎΠΆ Π½Π°:
Client: $ nc 127.0.0.1 8091 GET /about HTTP/1.0 Connection: close HTTP/1.0 200 OK Content-Type: text/html; charset=ISO-8859-1 Connection: close Server: 127.0.0.1 8091 127.0.0.2 8092 URI: /about OK