Ошибка ReventPHP libevent и socket_pair

У меня проблема, тогда я использую цикл обработки событий ReactPHP с stream_socket_pair.

С циклом StreamSelect это работает отлично, но затем я пытаюсь использовать его с расширением LibEvent, я получил неограниченный поток ошибок:

[warn] kevent: Bad file descriptor

Минимальный код для воспроизведения этой ошибки

<?php

require_once __DIR__ . '/vendor/autoload.php';

$loop = React\EventLoop\Factory::create();

$sockets = stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP);

$pid = pcntl_fork();
if ($pid > 0) {
fclose($sockets[1]);

$loop->addReadStream($sockets[0], function ($socket) {
$data = fread($socket, 100000);
echo '[' . posix_getpid() . '] Master: ' . $data . PHP_EOL;
});

$loop->addTimer(1, function () use ($sockets) {
fwrite($sockets[0], 'Hello slave!');
});

$loop->run();


} else {
fclose($sockets[0]);

$loop->addReadStream($sockets[1], function ($socket) {
$data = fread($socket, 100000);

echo '[' . posix_getpid() . '] Slave: ' . $data . PHP_EOL;
});

$loop->addTimer(1, function () use ($sockets) {
fwrite($sockets[1], 'Hello master!');
});

$loop->run();
exit();
}

pcntl_wait($status);

1

Решение

Это связано не с socket_pair, а с процессом разветвления. LibEvent заявляет, что:

Некоторые механизмы событий не выживают через форк. Event_base необходимо повторно инициализировать с помощью этой функции (event_base_reinit).

После добавления «event_base_reinit» после форка все работает потом

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]