(PECL event >= 1.2.6-beta)
EventHttp::accept — 使 HTTP 服务器在指定的套接字流或资源上接受连接
使 HTTP 服务器在指定的套接字流或资源上接受连接。套接字应准备好接受连接。
可以多次调用以在不同的套接字上接受连接。
注意:
要绑定套接字、
listen
并以一次调用在套接字上accept
连接,请使用 EventHttp::bind() 。 EventHttp::accept() 仅在已经拥有准备好接受连接的套接字时才需要。
socket
套接字资源、流或表示准备好接受连接的套接字的数字文件描述符。
范例 #1 EventHttp::accept() 范例
<?php
$base = new EventBase();
$http = new EventHttp($base);
$addresses = array (
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 "Accept 失败\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 "END\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