php epoll实现
PHP 中使用 epoll 实现高性能 I/O 多路复用
epoll 是 Linux 内核提供的一种高效的 I/O 事件通知机制,适用于高并发场景。PHP 可通过扩展或底层封装实现 epoll。
安装必要的扩展
确保系统已安装 libevent 或 ev 扩展。推荐使用 ev 扩展,因其对 epoll 的封装更直接:

pecl install ev
在 php.ini 中启用扩展:

extension=ev.so
使用 ev 扩展实现 epoll
以下是一个基于 ev 扩展的简单 TCP 服务器示例:
<?php
$socket = stream_socket_server("tcp://0.0.0.0:8000", $errno, $errstr);
stream_set_blocking($socket, false);
$loop = new EvLoop();
$watcher = $loop->io($socket, Ev::READ, function ($watcher, $revents) {
$client = stream_socket_accept($watcher->data);
fwrite($client, "HTTP/1.1 200 OK\r\nContent-Length: 5\r\n\r\nHello");
fclose($client);
});
$loop->run();
原生 PHP 结合 epoll(需 Linux 环境)
若需更底层控制,可通过 ext-sockets 和 ext-event 扩展实现:
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($socket, '0.0.0.0', 8000);
socket_listen($socket);
socket_set_nonblock($socket);
$eventBase = new EventBase();
$event = new Event($eventBase, $socket, Event::READ | Event::PERSIST, function ($fd) {
$client = socket_accept($fd);
socket_write($client, "Hello from epoll!\n");
socket_close($client);
});
$event->add();
$eventBase->loop();
关键点说明
- 非阻塞模式:必须将套接字设为非阻塞(
stream_set_blocking或socket_set_nonblock)。 - 事件类型:
Ev::READ或Event::READ表示监听可读事件。 - 性能优化:epoll 的优势在于高效处理大量并发连接,避免为每个连接创建线程/进程。
注意事项
- 仅限 Linux 系统(epoll 是 Linux 特有机制)。
- Windows 可使用
IOCP或select替代。 - 高并发场景建议结合协程(如 Swoole)进一步提升性能。






