React PHP如何处理异步非阻塞I/O?

7

React PHP如何处理异步非阻塞I/O?

Node.js使用事件队列在不同线程上处理I/O。它使用libuv实现。由于PHP中没有类似的机制,React如何在单个线程上处理非阻塞I/O过程?


可能是ReactPHP是真正的异步吗?的重复问题。 - Blizz
1个回答

12

React PHP提供了应用程序的主事件循环;但您仍需要以非阻塞方式编写代码,因为它都在一个线程上。解决此问题的可能方案都围绕着不同于大多数php开发人员习惯的php的使用方式...虽然React PHP提供了主循环;但React PHP库的大部分实现都是针对套接字/流/承诺等。这些都采用了各种方法来实现对I / O的非阻塞访问,通常是通过使用stream_set_blockinghttp://php.net/manual/en/function.stream-set-blocking.php)。

其他选项包括编写类似于FSM(https://en.wikipedia.org/wiki/Finite-state_machine)的程序;允许它在进展过程中不断更新其当前状态;每次允许某些代码块运行,然后将线程放弃给循环中的其他任何内容。实质上是实现自己的时间片(https://en.wikipedia.org/wiki/Preemption_(computing)#Time_slice

另一种选择是实现线程(http://php.net/manual/en/book.pthreads.php),通常情况下未启用;我能想到的最后一个选项是使用进程控制来分叉/启动/控制其他进程(http://php.net/manual/en/intro.pcntl.php),这仅在*nix系统上启用;它让您的主机CPU控制时间片,您只需要构建应用程序以使其线程安全,与消息队列通信或使用其他机制即可。

tldr;使用应用程序架构避免php阻塞,将流设置为非阻塞状态,或使用线程/进程控制来管理自己的多线程。


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