Pergunta

Se o mecanismo PHP já está no meio de executar um script no servidor o que aconteceria com outras solicitações do navegador simultâneas para o mesmo script?

  • Será que as petições sejam em fila?
  • Será que eles vão ser ignorada?
  • Será que cada pedido tem seu próprio roteiro exemplo?
  • Qualquer outra possibilidade?
Foi útil?

Solução

O servidor, dependendo de sua configuração, pode geralmente servem centenas de pedidos ao mesmo tempo - se estiver usando Apache, o MaxClients opção de configuração é o único a dizer:

A directiva define o MaxClients limite no número de simultânea solicitações que serão servidos.
Qualquer tentativas de ligação sobre o limite MaxClients será normalmente Em fila, até um número baseado no directiva ListenBacklog.
Quando uma criança processo é libertado no fim de um pedido diferente, a vontade de conexão em seguida, ser atendido.


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

Assim:

Será que as petições sejam em fila?

Não; exceto se:

  • há alguma Bloqueio em algum lugar - o que pode acontecer, por exemplo, se os dois pedidos vêm do mesmo cliente, e você estiver usando sessões baseadas em arquivos em PHP : enquanto um script está sendo executado, a sessão é "bloqueado", o que significa que o servidor / cliente terá que esperar até o primeiro pedido for concluído (e o arquivo desbloqueado ) para ser capaz de usar o arquivo para abrir a sessão para o segundo usuário.
  • as solicitações vêm do mesmo cliente e o mesmo navegador; a maioria dos navegadores irá fila os pedidos neste caso, mesmo quando não há nada produzir este comportamento do lado do servidor.
  • há mais de MaxClients processos ativos no momento - veja a citação de Apache do Manual pouco antes
  • .


Será que eles vão ser ignorada?

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

Se fosse o caso, eu não podia postar esta resposta, se você onde bater F5 no mesmo momento para ver se alguém respondeu!
(bem, então não é em PHP, mas os princípios são os mesmos)


Qualquer outra possibilidade?

Sim ^^


editar depois de editado o OP eo comentário:

Será que cada pedido tem seu próprio roteiro exemplo?

Não existe tal coisa como " instância de script ": em poucas palavras, o que está acontecendo quando um pedido para um script é feita é:

  • as forquilhas webserver outro processo para manipular a solicitação (muitas vezes, por motivos de desempenho, aqueles garfos são feitos antecipadamente, mas isso não muda nada)
  • o processo lê o script PHP a partir do disco
    • vários processos podem fazer isso ao mesmo tempo : não há bloqueio na leitura de arquivos
    • o arquivo é carregado na memória; em um bloco de memória distinta para cada processo
  • o arquivo PHP na memória é " compilado " para opcodes - ainda na memória
  • esses opcodes são executados - ainda a partir do bloco de memória que pertence ao processo respondendo a seu pedido


Realmente, você pode ter dois usuários enviando um pedido para o mesmo script PHP (ou a scripts distintos PHP que todos incluem o mesmo arquivo PHP) ; isso não é definitivamente um problema ou nenhum do site que eu já trabalhei iria trabalhar!

Outras dicas

Se 2 clientes chama o servidor ao mesmo tempo, o servidor é provavelmente capaz de responder ambos os clientes quase que simultaneamente. Os clientes aqui eu defini-los ao nível do navegador.

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

No entanto, uma vez que estamos falando de PHP, você precisa tomar notas especiais sobre sessões. Se as suas páginas utilizam sessões, o servidor só servem uma página de cada vez. Isso ocorre porque arquivo de sessão será bloqueado, até que um script saídas.

Veja este exemplo. Os 2 arquivos são carregados a partir da mesma sessão aka mesmo navegador 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 após scripta.php é servido. isso é porque quando scripta.php iniciado, o arquivo de sessão está bloqueado para outros scripts para que scripta.php pode escrever para o arquivo de sessão. Quando concluída scripta.php, o arquivo de sessão é desbloqueado e, portanto, outros scripts são capazes de usá-lo. Assim scriptb.php irá esperar até que o arquivo de sessão é libertado em seguida, ele irá travar o arquivo de sessão e usá-lo.

Este processo irá continuar a repetir a prevenir vários scripts de escrita para o mesmo arquivo de sessão causando atrasos. Assim, recomenda-se a chamar session_write_close () quando você não está mais usando a sessão, especialmente em um site usando muitas iframe ou AJAX.

Apenas correu para isso mesmo. Basicamente, você precisa chamar session_write_close() para evitar bloqueio de usuário único. Certifique-se de uma vez que você chamar session_write_close() você não tentar modificar quaisquer variáveis ??de sessão embora. Uma vez que você chamá-lo, sessões de tratar como somente leitura a partir de então.

A menos que você estiver executando uma configuração muito fora do padrão seu servidor web (Apache, IIS, nginx, etc.) terá vários processos que são executados PHP separadamente para cada solicitação que vem para o servidor. solicitações simultâneas serão atendidos simultaneamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top