EventHttp::accept

(PECL event >= 1.2.6-beta)

EventHttp::accept β€” ЗаставляСт HTTP-сСрвСр ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ соСдинСния Π½Π° Π·Π°Π΄Π°Π½Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ сокСта ΠΈΠ»ΠΈ рСсурса

ОписаниС

public function EventHttp::accept( mixed $socket ): bool

ЗаставляСт 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

Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅

  • EventHttp::bind() - ΠŸΡ€ΠΈΠ²ΡΠ·Ρ‹Π²Π°Π΅Ρ‚ HTTP-сСрвСр ΠΊ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ адрСсу ΠΈ ΠΏΠΎΡ€Ρ‚Ρƒ
οΌ‹Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Π΅Ρ‰Ρ‘ Π½Π΅ добавляли примСчания для страницы