неблокирование — невозможно выполнить неблокирующий ввод / вывод при переполнении стека React

Я пытаюсь вставить запись в базу данных, поступающую на сервер реагирующих сокетов. Я заблудился о том, как сделать свою работу неблокирующим способом

$loop = Factory::create();

$server = new Server('127.0.0.1:4040', $loop);
$database = new Database();

$server->on('connection', function(ConnectionInterface $conn)  use ($database) {
$conn->write('Welcome, you can start writing your notes now...');

$conn->on('data', function($data) use ($conn, $database) {
$database->write($data);
$conn->write('I am supposed to execute before database write');
});
});

$loop->run();

write Метод в базе данных имеет sleep(10) секунд до выполнения оператора sql. Так что жду следующего сообщения I am supposed to.. должен быть напечатан немедленно.

Я ожидал, что когда будет операция ввода-вывода, операция будет перемещена в таблицу событий и не будет блокировать стек вызовов. Согласно определению цикла событий и неблокирования.

Как я могу выполнить ту же операцию неблокирующим способом.

Спасибо

2

Решение

Эй, член основной команды ReactPHP здесь. Цикл ожидает, что все будет асинхронным, поэтому поместите режим сна в вашу базу данных $ database-> write ($ data); заблокирует цикл. Ваше соединение с базой данных должно использовать цикл обработки событий, чтобы оно было неблокирующим. Мое предложение будет смотреть на https://github.com/friends-of-reactphp/mysql или же https://github.com/voryx/PgAsync или проверьте список здесь https://github.com/reactphp/react/wiki/Users#databases в зависимости от вашей базы данных. ReactPHP волшебным образом не сделает все неблокирующим, вы должны использовать пакеты, которые позаботятся об этом за вас.

4

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector