
Atualmente, a programação assíncrona está em demanda, especialmente no desenvolvimento da Web, onde a capacidade de resposta do aplicativo é especialmente importante. Ninguém quer esperar até que o aplicativo "afunde", mesmo que nesse momento execute uma consulta ao banco de dados, envie um email ou trabalhe em outras tarefas que podem levar muito tempo. O cliente quer uma resposta para sua ação, o melhor de tudo - imediatamente. Se seu aplicativo for lento, você estará perdendo clientes. Diante de um aplicativo flutuante, na maioria das vezes o usuário simplesmente o fecha e nunca retorna. Do ponto de vista do usuário, o aplicativo travou, ele não consegue entender por que isso aconteceu: ele executa uma operação complexa ou deixou de funcionar em princípio.
Apresentando a tradução de um artigo do desenvolvedor de back-end da Skyeng, Sergey Zhuk.Capacidade de resposta do aplicativo
Os aplicativos modernos geralmente respondem, mas algumas tarefas ou operações, como a troca de dados em uma rede, a E / S de arquivos ou a consulta de um banco de dados, podem consumir tempo e retardar significativamente o aplicativo. Para impedir que essas operações bloqueiem o aplicativo, você pode executá-las em segundo plano, ocultando o atraso que elas causam. Ao mesmo tempo, o aplicativo permanece responsivo porque pode continuar executando outras tarefas, por exemplo, retornar o fluxo de controle para a interface com o usuário ou responder a outros eventos.
Concorrência e assincronia
Quando as pessoas veem código assíncrono, na maioria das vezes pensam imediatamente: “Ótimo, eu posso paralelizar os processos!”. Posso desapontá-lo, mas na verdade não é. Assincronia e simultaneidade não são a mesma coisa. Pode ser difícil perceber essa diferença, então vamos tentar descobrir.
Se as tarefas são executadas de forma assíncrona, elas não se bloqueiam e a execução de uma tarefa não depende da conclusão de outra. A simultaneidade, por sua vez, implica o lançamento de várias tarefas separadas simultaneamente como unidades de trabalho independentes.
Assincronia:
Vá e complete a tarefa você mesmo . Avise-me quando terminar e me mostre o resultado. Neste momento, posso continuar fazendo meu trabalho.
Código assíncrono requer o processamento de dependências que surgem durante a execução de tarefas, e isso é implementado usando retornos de chamada. Quando uma tarefa é concluída, o código notifica outra tarefa. O código assíncrono é basicamente o tempo que a tarefa leva para ser concluída (ordem dos eventos).

Concorrência:
Contrate quantos trabalhadores você desejar e compartilhe a tarefa entre eles para concluí-la mais rapidamente e me avise quando terminar. Posso continuar fazendo outras coisas ou, se a tarefa for urgente, ficarei e esperarei até você retornar com os resultados. Então eu posso compor o resultado final de todos os funcionários. A execução paralela geralmente requer mais recursos, então aqui depende basicamente do hardware.

Para entender a diferença entre execução assíncrona e paralela usando um exemplo da vida real, comparamos dois servidores Web populares: Apache e Nginx. Eles ilustram perfeitamente essa diferença. O Nginx usa um modelo assíncrono baseado em evento, enquanto o Apache usa threads paralelos. O Apache cria novos threads para cada conexão adicional; portanto, aqui o número máximo de conexões permitidas depende da quantidade de memória disponível no sistema. Quando o limite de conexão é atingido, o Apache para de criar conexões adicionais. O fator limitante ao configurar o Apache é a memória (lembre-se de que a execução paralela geralmente depende do hardware). Se o encadeamento parar, o cliente aguardará uma resposta até que o encadeamento esteja livre e possa enviar uma resposta.
O Nginx não funciona como o Apache - ele não cria novos threads para cada solicitação recebida. O Nginx possui um fluxo de trabalho principal (ou vários trabalhadores, geralmente para um processador, existe um fluxo de trabalho), que é de thread único. Este trabalhador pode processar milhares de conexões "simultaneamente" e faz de forma assíncrona, em um thread, e não em paralelo em vários threads.
Assim, "assincronia" é como construímos o sistema, é uma composição de processos independentes um do outro. Por "execução paralela" entende-se a execução de vários processos no mesmo momento, enquanto eles podem ou não estar relacionados. Na execução assíncrona, processamos várias tarefas ao mesmo tempo e, na execução paralela, iniciamos vários processos ao mesmo tempo. Pode parecer a mesma coisa, mas não é. Assincronia descreve uma estrutura, paralelismo descreve uma maneira de fazê-lo.
A execução assíncrona pode ser comparada aos dispositivos de E / S no seu computador (mouse, teclado, tela). Todos eles são gerenciados pelo sistema operacional, mas cada um deles é uma parte independente do kernel. Esses processos são assíncronos, podem ser paralelos, mas isso não é necessário. Portanto, para garantir consistência, você deve criar um link entre essas partes independentes para coordená-las.
E esse backend?
Você pode dizer que a capacidade de resposta não é tão importante no back-end. Todas essas coisas assíncronas e legais com JavaScript acontecem em um freeend, e seu servidor apenas responde às solicitações; portanto, um freeend deve responder pela capacidade de resposta do aplicativo, mas não você. Sim, isso é verdade, mas a tarefa do servidor não se limita às respostas da API. Às vezes, você precisa gerenciar tarefas complexas, por exemplo, baixar um vídeo. Nesse caso, a capacidade de resposta pode não ser um fator-chave, mas sua falta de recursos é desperdiçada porque o aplicativo precisa ficar inativo. Pode aguardar a conclusão das operações do sistema de arquivos, interações de rede, consultas ao banco de dados e similares. Geralmente, essas operações de E / S são muito lentas em comparação com os cálculos do processador, por exemplo, quando convertemos arquivos de vídeo. E enquanto salvamos ou lemos lentamente o arquivo, o processador é forçado a aguardar, em vez de realizar um trabalho útil. Como já descobrimos, em vez de esperar, podemos executar essas tarefas em segundo plano. Como Vá em frente.
PHP assíncrono
Em JavaScript, pronto para uso, estão disponíveis suporte e soluções integrados para escrever código assíncrono. Há também o Node.js, que permite gravar aplicativos de servidor assíncronos. Em JavaScript, podemos usar a função setTimeout () para demonstrar um exemplo de código assíncrono:

Quando executamos esse código, veremos o seguinte:

A função setTimeout () envia o código para a fila e o executa no final da pilha de chamadas atual. Isso significa que interrompemos o fluxo síncrono de código e atrasamos a execução. A segunda chamada para console.log () é realizada antes da chamada para a fila dentro da chamada setTimeout ().
E o PHP? No PHP, não temos ferramentas adaptadas adequadas para escrever código verdadeiramente assíncrono. Não há equivalente a setTimeout () e não podemos simplesmente atrasar ou enfileirar qualquer código. É por isso que estruturas e bibliotecas como Amp e ReactPHP começaram a aparecer. A idéia deles é ocultar os detalhes de baixo nível da linguagem e fornecer ao usuário ferramentas de alto nível que permitem escrever código assíncrono e gerenciar a execução competitiva de processos como JavaScript e Node.js.
Por que devo usar o PHP se houver Node.js e Go?
Essa pergunta geralmente surge quando se trata de PHP assíncrono. Por alguma razão, muitos são contra o uso do PHP para escrever código assíncrono. Alguém sempre sugere usar Go ou Node.js. em vez de PHP.
O
tweet assertchris descreve perfeitamente essas situações:

Obviamente, quando o PHP estava sendo criado, não havia nenhum objetivo em torná-lo uma linguagem de programação que pode ser usada para criar aplicativos grandes e complexos. Naquele momento, ninguém pensava em JavaScript ou assincronia. Mas agora temos um PHP completamente diferente que já possui suas próprias funções para escrever código assíncrono (por exemplo, a função stream_select ()).
Sim, você pode usar Go ou Node.js para criar aplicativos de servidor assíncronos, mas isso nem sempre resolve o problema. Se você já possui uma vasta experiência com PHP, será muito mais fácil aprender as bibliotecas e ferramentas apropriadas para sua situação do que aprender um novo idioma e um novo ecossistema. Ferramentas como
ReactPHP ou
Amp permitem que você escreva código assíncrono da mesma forma que em Node.js. Essas ferramentas são bastante desenvolvidas e têm versões estáveis, para que você possa usá-las com segurança na produção.
Não apenas CLI
Não vou escrever um bate-papo, servidor ou algo assim. Eu só quero acelerar o site.
É geralmente aceito que o código assíncrono pode ser usado apenas em scripts da CLI. É absolutamente normal integrar alguns componentes assíncronos em um ambiente síncrono tradicional, mesmo em um aplicativo Web tradicional. Por exemplo, você pode receber uma solicitação e, em seguida, chamar vários recursos diferentes de forma assíncrona. Quando essas chamadas são concluídas, você pode continuar o ciclo de vida da resposta à solicitação e, como resultado, a página será exibida mais rapidamente.
Ou você precisa fazer algumas chamadas externas à API - por exemplo, quando um usuário conclui um pagamento, você deseja enviar um email ou uma notificação por push. Você pode fazer essas chamadas de API de forma assíncrona e continuar seu fluxo de código síncrono tradicional. Não há necessidade de reescrever completamente o aplicativo e excluir tudo o que diminui a velocidade. Basta identificar gargalos que interferem no desempenho e é possível que eles possam ser corrigidos usando código assíncrono.
Sim, na maioria dos casos, o código assíncrono ainda é usado nos scripts da CLI, mas não está limitado a bate-papos e servidores em tempo real. Se você deseja apenas acelerar o site, não precisa abrir mão da estrutura do Symfony ou do Laravel e criar seu próprio servidor de aplicativos completamente assíncrono.
Conclusão
Não tenha medo de aprender um novo paradigma. O PHP é muito mais do que "executar um script, executar código e morrer". Você ficará surpreso ao perceber que pode usar o PHP familiar de uma maneira completamente nova, como se nunca o tivesse usado! O código assíncrono e a programação orientada a eventos expandirão sua compreensão do PHP e as possibilidades de uso dessa linguagem. Você não precisa aprender um novo idioma para escrever aplicativos assíncronos apenas porque "PHP é uma ferramenta inadequada" ou "Eu sempre fiz isso, não pode ser aprimorado". Apenas tente!
Bem, lembramos também que sempre temos muitas
vagas interessantes para desenvolvedores!