3

我正在尝试在数据库中插入一条记录到反应套接字服务器。我不知道如何以非阻塞方式进行操作

$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..应该立即打印出来。

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

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

谢谢

4

1 回答 1

8

嘿 ReactPHP 核心团队成员。循环期望一切都是异步的,所以在你的 $database->write($data); 中放置一个睡眠。将阻塞循环。您的数据库连接必须利用事件循环才能实现非阻塞。我的建议是查看https://github.com/friends-of-reactphp/mysqlhttps://github.com/voryx/PgAsync或查看此处的列表https://github.com/reactphp/react /wiki/Users#databases取决于您的数据库。ReactPHP 不会神奇地让一切都变成非阻塞的,你必须使用包来为你处理这些。

于 2018-05-04T07:24:52.990 回答