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