2015-06-16 18 views
6

Wie reagiert PHP asynchrone nicht blockierende E/A?Wie reagiert PHP asynchrone nicht blockierende E/A?

Nodejs verwendet seine Ereigniswarteschlange, die I/O auf verschiedenen Threads behandelt. Es verwendet libuv dafür. Wie in PHP gibt es so etwas nicht, wie reagiert React nicht blockierende I/O-Prozess auf einem einzigen Thread?

+0

mögliche Duplikate von [ReactPHP ist wirklich asynchron?] (Http://StackOverflow.com/questions/22502118/reactphp-is-truely-asynchronous) – Blizz

Antwort

12

React PHP stellt die primäre Ereignisschleife der Anwendung bereit; Sie müssen Ihren Code weiterhin auf nicht blockierende Weise schreiben, da sich alles auf einem Thread befindet. Die möglichen Lösungen für dieses alles drehen sich um die Verwendung von PHP anders als ich sicher bin, dass die meisten PHP-Entwickler daran gewöhnt sind ... Obwohl React PHP die Hauptschleife bietet; Der Großteil der React PHP-Bibliotheken sind die Implementierungen für sockets/streams/promise/etc. Diese haben alle Methoden verwendet, um einen nicht blockierenden Zugriff auf die E/A zu erreichen; in der Regel durch die Verwendung von stream_set_blocking (http://php.net/manual/en/function.stream-set-blocking.php)

Die anderen Optionen umfassen die Programmierung von etwas ähnlich wie eine FSM (https://en.wikipedia.org/wiki/Finite-state_machine); was es ermöglicht, den aktuellen Zustand kontinuierlich zu aktualisieren, während es fortschreitet; jedes Mal, wenn bestimmte Codeabschnitte ausgeführt werden, und dann den Thread für alles andere in der Schleife freigeben. Implementieren Sie im Wesentlichen Ihre eigenen Zeit-Slicing (https://en.wikipedia.org/wiki/Preemption_(computing)#Time_slice)

Eine weitere Option ist die Implementierung von Threads (http://php.net/manual/en/book.pthreads.php), die normalerweise nicht standardmäßig aktiviert ist; Und die letzte Option, die ich mir vorstellen kann, ist die Verwendung der Prozesssteuerung, um andere Prozesse (http://php.net/manual/en/intro.pcntl.php), die nur auf * nix-Systemen aktiviert sind, zu verzweigen/zu starten/zu steuern; mit dem Ihre Host-CPU das Zeit-Slicing steuern kann; Sie müssen lediglich Ihre Anwendung so entwerfen, dass sie threadsicher ist, mit Nachrichtenwarteschlangen oder anderen Mechanismen kommuniziert.

tldr; Verwenden Sie Ihre Anwendungsarchitektur, um zu verhindern, dass PHP blockiert, legen Sie fest, dass Ihre Streams nicht blockiert werden, oder verwenden Sie die Thread-/Prozesssteuerung, um Ihr eigenes Multithreading zu verwalten.