我正在尝试在反应套接字服务器的数据库中插入一条记录。我迷失了如何以非阻塞方式进行操作
$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操作时,操作将被移动到事件表并且不会阻塞调用堆栈。根据事件循环和非阻塞的定义。
如何以非阻塞方式执行相同的操作。
由于
答案 0 :(得分:4)
嘿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不会神奇地使所有东西都无阻塞,你必须使用能够解决这个问题的软件包。