Pregunta

Si el motor PHP ya está en el medio de ejecutar un script en el servidor, ¿qué pasaría con otras solicitudes simultáneas del navegador al mismo script?

  • ¿Se pondrán en cola las solicitudes?
  • ¿Serán ignorados?
  • ¿Cada solicitud tendrá su propio script instancia?
  • ¿Alguna otra posibilidad?
¿Fue útil?

Solución

El servidor, dependiendo de su configuración, generalmente puede atender cientos de solicitudes al mismo tiempo : si usa Apache, el MaxClients la opción de configuración es la que dice:

  

La directiva MaxClients establece el   límite en el número de simultáneos   solicitudes que serán atendidas.
Cualquiera   intentos de conexión sobre el   El límite MaxClients normalmente será   en cola, hasta un número basado en el   Directiva ListenBacklog.
Una vez niño   el proceso se libera al final de un   solicitud diferente, la conexión será   luego recibir servicio.


El hecho de que dos clientes soliciten la misma página no es un problema.

Entonces:

  

¿Se pondrán en cola las solicitudes?

No; excepto si:

  • hay algún bloqueo en alguna parte, lo que puede suceder, por ejemplo, si las dos solicitudes provienen del mismo cliente y está utilizando sesiones basadas en archivos en PHP : mientras se ejecuta un script, la sesión está "bloqueada", lo que significa que el servidor / cliente tendrá que esperar hasta que finalice la primera solicitud (y el archivo desbloqueado ) para poder use el archivo para abrir la sesión para el segundo usuario.
  • las solicitudes provienen del mismo cliente Y del mismo navegador; la mayoría de los navegadores pondrán en cola las solicitudes en este caso, incluso cuando no haya nada del lado del servidor que produzca este comportamiento.
  • hay más de MaxClients procesos actualmente activos - vea la cita del manual de Apache justo antes.


  

¿Serán ignorados?

No: esto significaría que solo un usuario puede usar un sitio web al mismo tiempo; esto no sería del todo bueno, ¿verdad?

Si fuera el caso, no podría publicar esta respuesta, si golpeas F5 en el mismo momento para ver si alguien respondió.
(Bueno, SO no está en PHP, pero los principios son los mismos)


  

¿Alguna otra posibilidad?

Sí ^^


editar después de editar el OP y el comentario:

  

¿Cada solicitud tendrá su propio script   instancia?

No existe tal cosa como " instancia de script " : en pocas palabras, lo que sucede cuando se realiza una solicitud a un script es:

  • el servidor web bifurca otro proceso para manejar la solicitud (a menudo, por razones de rendimiento, esas bifurcaciones se hacen por adelantado, pero esto no cambia nada)
  • el proceso lee el script PHP del disco
    • varios procesos pueden hacer esto al mismo tiempo : no hay bloqueo en la lectura de archivos
    • el archivo se carga en la memoria; en un bloque de memoria distinto para cada proceso
  • el archivo PHP en memoria está " compilado " a códigos de operación - todavía en memoria
  • esos códigos de operación se ejecutan, aún desde el bloque de memoria que pertenece al proceso que responde a su solicitud


Realmente, puede hacer que dos usuarios envíen una solicitud al mismo script PHP (o a scripts PHP distintos que incluyan todos el mismo archivo PHP) ; eso definitivamente no es un problema, ¡o ninguno de los sitios web en los que trabajé funcionaría!

Otros consejos

Si 2 clientes llaman al servidor al mismo tiempo, es probable que el servidor pueda responder a ambos clientes casi simultáneamente. Los clientes aquí los defino al nivel del navegador.

Significa decir que en la misma máquina, si está utilizando 2 navegadores para cargar el mismo sitio web / página al mismo tiempo, ambos deben cargarse al mismo tiempo.

sin embargo, dado que estamos hablando de PHP, debe tomar notas especiales sobre las sesiones. Si sus páginas usan sesiones, el servidor solo sirve una página a la vez. Esto se debe a que el archivo de sesión se bloqueará hasta que salga un script.

Mira este ejemplo. Los 2 archivos se cargan desde la misma sesión, es decir, el mismo navegador y el mismo usuario.

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

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

Observe que scriptb.php solo se inicia después de que se sirve scripta.php. Esto se debe a que cuando se inició scripta.php, el archivo de sesión está bloqueado a otros scripts para que scripta.php pueda escribir en el archivo de sesión. Cuando se completa scripta.php, el archivo de sesión se desbloquea y, por lo tanto, otros scripts pueden usarlo. Por lo tanto, scriptb.php esperará hasta que se libere el archivo de sesión, luego bloqueará el archivo de sesión y lo usará.

Este proceso continuará repitiéndose para evitar que se escriban múltiples scripts en el mismo archivo de sesión causando demoras. Por lo tanto, se recomienda llamar a session_write_close () cuando ya no esté utilizando la sesión, especialmente en un sitio web que usa muchos iframes o AJAX.

Me encontré con esto yo mismo. Básicamente, debe llamar a session_write_close () para evitar el bloqueo de un solo usuario. Asegúrese de que una vez que llame a session_write_close () , no intente modificar ninguna variable de sesión. Una vez que lo llame, trate las sesiones como de solo lectura a partir de ese momento.

A menos que esté ejecutando una configuración muy no estándar, su servidor web (Apache, IIS, nginx, etc.) tendrá múltiples procesos que ejecutan PHP por separado para cada solicitud que ingresa al servidor. Las solicitudes simultáneas serán atendidas simultáneamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top