https://github.com/chopins/php-epoll
php bindings to the linux epoll API
https://github.com/chopins/php-epoll
asynchronous epoll event ffi linux php
Last synced: 2 months ago
JSON representation
php bindings to the linux epoll API
- Host: GitHub
- URL: https://github.com/chopins/php-epoll
- Owner: chopins
- License: other
- Created: 2019-09-21T16:30:13.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2020-11-12T17:24:01.000Z (over 4 years ago)
- Last Synced: 2025-03-26T08:05:25.729Z (3 months ago)
- Topics: asynchronous, epoll, event, ffi, linux, php
- Language: PHP
- Size: 43.9 KB
- Stars: 31
- Watchers: 1
- Forks: 5
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# php-epoll
PHP bindings to the linux epoll API.### Requirements
* PHP >= 7.4
* PHP FFI extension available
* Linux > 2.6
* toknot/ffi-extend>=0.1### Install
use composer install:
```
composer require toknot/php-epoll```
include composer autoload file : `./vendor/autoload.php`## Reference
* `Epoll::__construct()`
* `Epoll::create(int $flags)`open an epoll file descriptor
* `Epoll::ctl(int $op, int $fd, EpollEvent $events): int`control interface for an epoll file descriptor
* `Epoll::wait(EpollEvent $event, int $maxevents, int $timeout, $sigmask = null): int`wait for an I/O event on an epoll file descriptor
* `Epoll::getFdno(resource $file, int $type): int`get id from file descriptor of php resource
* `Epoll::lastErrno(): int`get last error code
* `Epoll::lastError(): string`get last error message
* `Epoll::ffi(): FFI`
* `Epoll::initEvents($num): EpollEvent`
* `EpollEvent::__construct(Epoll $epoll,$num)`
* `EpollEvent::setEvent($event, $idx)`set Epoll events
* `EpollEvent::setData($data, $idx)`set user data variable
* `EpollEvent::getEvents($idx): FFI\CData`## Simple Example
php resource to file descriptor
```php
$epoll = new Epoll();
$fp = fopen(__FILE__, 'rb');
$fdno = $epoll->getFdno($fp, Epoll::RES_TYPE_FILE);
$fdfp = fopen("php://fd/$fdno", 'rb');
echo fread($fdfp, 1024);
```epoll example from `man epoll`
```php
const MAX_EVENTS = 10;
const EXIT_FAILURE = 1;$epoll = new Epoll();
$ev = $epoll->initEvents(MAX_EVENTS);
$events = $epoll->initEvents();
$stream = stream_socket_server("tcp://0.0.0.0:8000", $errno, $errstr);
$listen_sock = $epoll->getFdno($stream, Epoll::RES_TYPE_NET);function perror($str) {
fprintf(STDERR, $str);
}$epollfd = $epoll->create(0);
$ev->setEvent(Epoll::EPOLLIN);
$ev->setData(['fd' => $listen_sock]);if ($epoll->ctl(Epoll::EPOLL_CTL_ADD, $listen_sock, $ev) == -1) {
perror("epoll_ctl: listen_sock");
exit(EXIT_FAILURE);
}for (;;) {
$nfds = $epoll->wait($events, MAX_EVENTS, -1);
if ($nfds == -1) {
perror("epoll_wait");
exit(EXIT_FAILURE);
}for ($n = 0; $n < $nfds; ++$n) {
if ($events[$n]->data->fd == $listen_sock) {
$conn_sock = stream_socket_accept($stream);
if (!$conn_sock) {
perror("accept");
exit(EXIT_FAILURE);
}
stream_set_blocking($conn_sock, false);
$ev->setEvent(Epoll::EPOLLIN | Epoll::EPOLLET);
$connFdno = $epoll->getFdno($conn_sock, Epoll::RES_TYPE_NET);
$ev->setData(['fd' => $connFdno]);
if ($epoll->ctl(Epoll::EPOLL_CTL_ADD, $connFdno,
$ev) == -1) {
perror("epoll_ctl: conn_sock");
exit(EXIT_FAILURE);
}
} else {
do_use_fd($events[$n]->data->fd);
}
}
}
```