Termin "asynchroniczny" jest często nadużywany w programowaniu sieciowym. W przypadku operacji we/wy asynchroniczne często są po prostu używane jako inne słowo nie blokujące. Oznacza to, że proces może być kontynuowany przed zakończeniem transmisji w api sieci.
Dla realizacji procesu w ogół asynchroniczny oznacza wielokrotne instrukcje mogą być obliczane jednocześnie (równolegle).
Innymi słowy, asynchroniczny I/O nie jest prawdziwie asynchroniczne o ile kilka nici są stosowane w celu umożliwienia wielokrotnego czyta/zapisuje/akceptuje, aby wystąpiły jednocześnie - wszystkie gniazda będą musiały czekać na synchroniczne wywołanie nieblokujące, jeśli ma dane do odczytu/zapisu lub nie będzie blokować, a odczyt/zapis dużego pliku może nadal zająć sekundy lub nawet minuty, jeśli nie zostanie przerwany. Należy zauważyć, że wymagałoby to doskonałego przepływu między klientem a serwerem lub sam TCP przerwie transmisję. Na przykład serwer wysyłający szybciej niż klient może pobrać, spowoduje blokowanie zapisu.
Z ścisłego punktu widzenia PHP nie może wykonywać asynchronicznych połączeń sieciowych, a jedynie blokować. W skrócie, postęp procesu zatrzyma się, gdy połączenie sieciowe będzie w stanie z pożytkiem odczytywać/zapisywać itd. Jednak proces będzie kontynuowany, gdy wywołanie nie będzie w stanie z pożytkiem odczytać/zapisać lub w przeciwnym razie zablokować. W prawdziwie asynchronicznym systemie proces będzie kontynuowany niezależnie, a odczyt/zapis zostanie wykonany w innym wątku. Zauważ, że blokowanie operacji we/wy może być wykonane asynchronicznie, jeśli zostanie wykonane w innym wątku.
Co więcej, PHP nie jest w stanie wykonywać sterowanych przez zdarzenia operacji we/wy bez instalowania rozszerzenia, które je obsługuje. W przeciwnym razie musisz wykonać jakąś formę odpytywania, aby wykonać nieblokujące operacje we/wy w PHP. Kod z Chaos byłby funkcjonalnym nieblokującym odczytanym przykładem, gdyby używał socket_select.
Przy tym powiedziane, funkcja select nadal zezwala na zachowanie nie blokujące w PHP. W języku C usługi odpytywania mają utratę wydajności w stosunku do zdarzeń, więc jestem pewien, że byłoby to takie samo w przypadku PHP. Ale ta strata jest w nanosekundach-mikrosekundach w zależności od ilości gniazd, gdzie czas zaoszczędzony od połączenia nie blokującego to zwykle milisekundy, a nawet sekundy, jeśli połączenie ma czekać.
Co masz na myśli inaczej? Czy możesz pokazać mi jakieś próbki kodu zdarzeń asynchronicznych odebranych? –
To jest synchroniczne, ale nie blokujące? Co dokładnie oznacza brak blokowania? –
Nie, jest to asynchroniczne i oparte na odpytywaniu. Kod pochodzi z większego mechanizmu odpytywania. PHP nie ma wsparcia dla zdarzeń wejścia/wyjścia gniazda sterowanego przerwaniami/sygnałami, o ile wiem, o co prosisz. Osiągasz asynchroniczną komunikację za pomocą operacji, które nie czekają na zakończenie, ale natychmiast powracają z indykatywnym kodem błędu, jeśli operacja nie jest gotowa. Jak czyta na nieblokującym gnieździe. Istnieje wiele samouczków na temat użycia asynchronicznego gniazda w C, które będą zawierały wiele szczegółów; Wsparcie PHP to tylko warstwa ponad standardowymi materiałami C. – chaos