2015-06-16 79 views
6

React PHP如何處理異步非阻塞I/O?React PHP如何處理異步非阻塞I/O?

Nodejs使用它的事件隊列來處理不同線程上的I/O。它爲此使用libuv。正如在PHP中沒有那樣的東西,React如何處理單個線程上的非阻塞I/O進程?

+0

[ReactPHP是否真的是異步?](http://stackoverflow.com/questions/22502118/reactphp-is-truely-asynchronous) – Blizz

回答

12

React PHP提供應用程序的主要事件循環;您仍然需要以非阻塞的方式編寫代碼,因爲它全部在一個線程上。這一切的可能的解決方案圍繞使用PHP不同,我相信大多數PHP開發人員都習慣於......雖然React PHP提供了主循環;大部分React PHP庫都是sockets/streams/promise/etc的實現。這些都採用了方法來實現對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);我能想到的最後一個選項是使用流程控制來分叉/啓動/控制僅在* nix系統上啓用的其他流程(http://php.net/manual/en/intro.pcntl.php);它讓主機CPU控制時間分片;您只需要構建您的應用程序,以使其成爲線程安全的,與消息隊列通信或其他一些機制。

tldr;使用你的應用程序架構不會導致php阻塞,設置你的流不阻塞,或者使用線程/進程控制來管理你自己的多線程。