Термин «асинхронный» часто неправильно используется в сетевом программировании. Для ввода / вывода асинхронный часто используется просто как другое слово для неблокирования. Это означает, что процесс может продолжаться до того, как вызов в сети API завершит передачу.
Для выполнения процесса в целом асинхронный означает, что несколько команд могут быть вычислены одновременно (одновременно).
Другими словами, асинхронный ввод-вывод не является действительно асинхронным, если только несколько потоков не используются для одновременного выполнения нескольких операций чтения / записи / принятия - все сокеты будут вынуждены ожидать синхронного неблокирующего вызова, если у него есть данные быть прочитанным / записанным или иным образом не заблокированным, а чтение / запись большого файла может все еще занять секунды или даже минуты, если не прервано. Обратите внимание, что для этого потребуется идеальный поток между клиентом и сервером, иначе сам TCP прервет передачу. Например, сервер, отправляющий быстрее, чем клиент может загрузить, может вызвать блокировку записи.
Таким образом, со строгой точки зрения PHP не может выполнять асинхронную сеть, только неблокирующую. Короче говоря, выполнение процесса остановится, когда сетевой вызов сможет с пользой читать / записать и т. Д. Однако процесс будет продолжен, когда вызов не сможет с пользой прочитать / записать или заблокировать его иным образом. В действительно асинхронной системе процесс будет продолжаться независимо, а чтение / запись будет выполняться в другом потоке. Обратите внимание, что блокировка ввода-вывода может выполняться асинхронно, если она выполняется в другом потоке.
Более того, PHP не может выполнять управляемый событиями ввод-вывод без установки расширения, которое его поддерживает. В противном случае вам потребуется выполнить некоторую форму опроса, чтобы выполнить неблокирующий ввод / вывод в PHP. Код из Chaos был бы функциональным неблокирующим примером чтения, если бы он использовал socket_select.
С учетом вышесказанного, функция выбора по-прежнему разрешает истинное неблокирующее поведение в PHP. В C сервисы опроса теряют производительность по сравнению с событиями, поэтому я уверен, что для PHP это будет так же. Но эта потеря составляет наносекунды-микросекунды в зависимости от количества сокетов, где время, сэкономленное на неблокирующем вызове, обычно составляет миллисекунды или даже секунды, если вызов выполняется для ожидания.