Solicitações simultâneas de script PHP

86

Se o PHP Engine já estiver executando um script no servidor, o que aconteceria com outras solicitações simultâneas do navegador para o mesmo script?

  • Os pedidos ficarão na fila?
  • Eles serão ignorados?
  • Cada solicitação terá sua própria instância de script?
  • Alguma outra possibilidade?
Kevin Boyd
fonte
1
Verifique também esta resposta: konrness.com/php5/how-to-prevent-blocking-php-requests
trante

Respostas:

141

O servidor, dependendo de sua configuração, geralmente pode atender centenas de solicitações ao mesmo tempo - se estiver usando Apache, a MaxClientsopção de configuração é a que diz:

A MaxClientsdiretiva define o limite do número de solicitações simultâneas que serão atendidas.
Qualquer tentativa de conexão acima do MaxClients limite normalmente será enfileirada, até um número baseado na diretiva ListenBacklog.
Depois que um processo filho é liberado no final de uma solicitação diferente, a conexão será atendida.


O fato de dois clientes solicitarem a mesma página não é um problema.

Então :

Os pedidos ficarão na fila?

Não ; exceto se :

  • há algum bloqueio em algum lugar - o que pode acontecer, por exemplo, se as duas solicitações vierem do mesmo cliente, e você estiver usando sessões baseadas em arquivo em PHP : enquanto um script está sendo executado, a sessão é "bloqueada", o que significa que o servidor / cliente terá que esperar até que a primeira solicitação seja concluída (e o arquivo desbloqueado ) para poder usar o arquivo para abrir a sessão para o segundo usuário.
  • as solicitações vêm do mesmo cliente E do mesmo navegador; a maioria dos navegadores enfileira as solicitações neste caso, mesmo quando não há nada do lado do servidor produzindo esse comportamento.
  • há mais do que MaxClientsprocessos ativos atualmente - veja a citação do manual do Apache antes.


Eles serão ignorados?

Não: isso significa que apenas um usuário pode usar um site ao mesmo tempo; isso não seria muito bom, seria?

Se fosse o caso, eu não poderia postar essa resposta, se você estivesse apertando F5 no mesmo momento para ver se alguém atendia!
(Bem, SO não está em PHP, mas os princípios são os mesmos)


Alguma outra possibilidade?

Sim ^^


edite depois de editar o OP e o comentário:

Cada solicitação terá sua própria instância de script?

Não existe " instância de script ": em poucas palavras, o que está acontecendo onde uma solicitação a um script é feita é:

  • o servidor da web bifurca outro processo para lidar com a solicitação (muitas vezes, por motivos de desempenho, esses bifurcações são feitas com antecedência, mas isso não muda nada)
  • o processo lê o script PHP do disco
    • vários processos podem fazer isso ao mesmo tempo : não há bloqueio na leitura do arquivo
    • o arquivo é carregado na memória; em um bloco de memória distinto para cada processo
  • o arquivo PHP na memória é " compilado " para opcodes - ainda na memória
  • esses opcodes são executados - ainda do bloco de memória que pertence ao processo que responde ao seu pedido


Na verdade, você pode ter dois usuários enviando uma solicitação para o mesmo script PHP (ou para scripts PHP distintos que incluem o mesmo arquivo PHP) ; isso definitivamente não é um problema, ou nenhum dos sites em que trabalhei funcionaria!

Pascal MARTIN
fonte
Se várias solicitações simultâneas estiverem acessando o mesmo arquivo php, qual será o resultado. as outras solicitações serão mantidas pendentes ou cada solicitação terá sua própria instância de script?
Kevin Boyd,
3
Não existe "instância de script": cada solicitação é processada por um processo (ou thread) distinto ;; os scripts são lidos da memória / disco, mas o mesmo arquivo pode ser lido de vários processos ao mesmo tempo sem problemas (pelo menos, em sistemas operacionais "modernos" - isto é, Windows e Linux)
Pascal MARTIN
Esta é uma resposta excelente, onde posso aprender mais detalhes sobre como o PHP funciona? Algum livro bom para isso?
Kevin Boyd,
1
Eu realmente não sei sobre isso: acho que ler o manual, ler artigos na rede, perguntas / respostas aqui e ali, e trabalhar com PHP por vários anos é uma boa maneira de aprender - mas eu posso ' Realmente recomendo qualquer livro que explique exatamente como o PHP funciona ;; existem algumas informações em "Extending and Embedding PHP", mas o assunto não é explicar como o PHP funciona ;; talvez php.net/manual/en/internals2.php possa ajudar?
Pascal MARTIN
Perfeição! Me ajudou muito !
zookastos
21

Se 2 clientes chamam o servidor ao mesmo tempo, o servidor provavelmente é capaz de responder a ambos os clientes quase simultaneamente. Os clientes aqui, eu os defino no nível do navegador.

Quer dizer que na mesma máquina, se você estiver usando 2 navegadores para carregar o mesmo site / página ao mesmo tempo, ambos devem ser carregados ao mesmo tempo.

entretanto, como estamos falando sobre PHP, você precisa fazer anotações especiais sobre as sessões. Se suas páginas usam sessões, o servidor serve apenas uma página por vez. Isso ocorre porque o arquivo da sessão ficará bloqueado até que um script seja encerrado.

Veja este exemplo. Os 2 arquivos são carregados da mesma sessão, também conhecido como mesmo navegador do mesmo usuário.

      scripta.php requested                 scripta.php served
------+---+---------------------------------+------------------------>
          scripta.php started

               scriptb.php requested           scriptb.php started
---------------+-------------------------------+-----------------+--->
                                                                 scriptb.php served.

Observe que scriptb.php só é iniciado depois que scripta.php é servido. isso ocorre porque quando o script.php é iniciado, o arquivo da sessão é bloqueado para outros scripts para que o script.php possa gravar no arquivo da sessão. Quando o script.php é concluído, o arquivo da sessão é desbloqueado e, portanto, outros scripts podem usá-lo. Assim, o scriptb.php irá esperar até que o arquivo da sessão seja liberado, então ele irá bloquear o arquivo da sessão e usá-lo.

Esse processo continuará se repetindo para evitar que vários scripts gravados no mesmo arquivo de sessão causem atrasos. Portanto, é recomendável chamar session_write_close() quando você não estiver mais usando a sessão, especialmente em um site que usa muitos iframes ou AJAX.

mauris
fonte
4

Apenas corri para isso sozinho. Basicamente, você precisa ligar session_write_close()para evitar o bloqueio de um único usuário. No session_write_close()entanto, certifique-se de não tentar modificar nenhuma variável de sessão depois de chamar . Depois de chamá-lo, trate as sessões como somente leitura a partir de então.

Justin
fonte
3

A menos que você esteja executando uma configuração muito diferente do padrão, seu servidor web (Apache, IIS, nginx, etc.) terá vários processos que executam PHP separadamente para cada solicitação que chega ao servidor. Solicitações simultâneas serão atendidas simultaneamente.

conceptDawg
fonte