无法在React PHP中执行非阻塞I / O.

时间:2018-05-04 06:47:14

标签: php nonblocking event-loop reactphp

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

$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 个答案:

答案 0 :(得分:4)

嘿ReactPHP核心团队成员在这里。循环期望一切都是异步的,所以在$ database-> write($ data)中放入一个睡眠;将阻止循环。您的数据库连接必须利用事件循环才能使其无阻塞。我的建议是查看https://github.com/friends-of-reactphp/mysqlhttps://github.com/voryx/PgAsync或查看此处的列表https://github.com/reactphp/react/wiki/Users#databases,具体取决于您的数据库。 ReactPHP不会神奇地使所有东西都无阻塞,你必须使用能够解决这个问题的软件包。