React PHP 中无法进行非阻塞 I/O。

3
我正在尝试向React Socket服务器中的数据库插入记录。我不知道如何以非阻塞的方式执行此操作。
$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方法在执行SQL语句之前有sleep(10)秒的延迟。因此,我期望下一个消息I am supposed to..应该立即打印出来。

我的期望是,每当有I/O操作时,该操作将被移动到事件表中,并且不会阻塞调用堆栈。根据事件循环和非阻塞的定义。

如何以非阻塞的方式执行相同的操作。

谢谢

1个回答

8

你好,我是ReactPHP核心团队成员。事件循环期望所有操作都是异步的,因此在 $database->write($data); 中添加 sleep 会阻塞事件循环。为了使数据库连接非阻塞,必须利用事件循环。我的建议是查看https://github.com/friends-of-reactphp/mysqlhttps://github.com/voryx/PgAsync或根据你的数据库在https://github.com/reactphp/react/wiki/Users#databases列表中查找适合你的包。ReactPHP不能神奇地使一切都变得非阻塞,你必须使用能够为你处理这些问题的包。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接