Solicitudes simultáneas al script PHP

85

Si el motor PHP ya está ejecutando 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 propia instancia de script?
  • ¿Alguna otra posibilidad?
Kevin Boyd
fuente
1
También verifique esta respuesta: konrness.com/php5/how-to-prevent-blocking-php-requests
trante

Respuestas:

140

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

La MaxClientsdirectiva establece el límite en el número de solicitudes simultáneas que se atenderán.
Cualquier intento de conexión por encima del MaxClients límite normalmente se pondrá en cola, hasta un número basado en la directiva ListenBacklog.
Una vez que se libera un proceso hijo al final de una solicitud diferente, la conexión será atendida.


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 se desbloquee ) para poder usar 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 en el servidor que produzca este comportamiento.
  • hay más que MaxClientsprocesos actualmente activos; consulte 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 muy agradable, ¿verdad?

Si fuera el caso, no podría publicar esta respuesta, si presiona F5 en el mismo momento para ver si alguien responde.
(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 propia instancia de script?

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 realizan con anticipación, 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 la memoria se " compila " en los códigos de operación, todavía en la 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 (oa distintos scripts PHP que incluyen el mismo archivo PHP) ; Eso definitivamente no es un problema, ¡o ninguno de los sitios web en los que he trabajado funcionaría!

Pascal MARTIN
fuente
Si varias solicitudes simultáneas acceden al mismo archivo php, cuál sería el resultado. ¿Se mantendrán pendientes las otras solicitudes o cada solicitud tendrá su propia instancia de script?
Kevin Boyd
3
No existe una "instancia de script": cada solicitud es procesada por un proceso (o subproceso) distinto ;; los scripts se leen desde la memoria / disco, pero el mismo archivo se puede leer desde muchos procesos al mismo tiempo sin problemas (al menos, en sistemas operativos "modernos", es decir, tanto Windows como Linux)
Pascal MARTIN
Esta es una excelente respuesta, ¿dónde puedo obtener más detalles sobre cómo funciona PHP? ¿Algún buen libro para esto?
Kevin Boyd
1
Realmente no sé sobre eso: supongo que leer el manual, leer artículos en la red, preguntas / respuestas aquí y allá, y trabajar con PHP durante varios años es una buena manera de aprender, pero puedo ' Realmente recomiendo cualquier libro que explique exactamente cómo funciona PHP ;; hay alguna información en "Ampliación e incorporación de PHP", pero su tema no es explicar cómo funciona PHP; ¿Quizás php.net/manual/en/internals2.php pueda ayudar?
Pascal MARTIN
¡Perfección! Me ayudo mucho !
zookastos
21

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

Es decir, 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 utilizan 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, también conocido como el mismo navegador, el mismo usuario.

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

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

Tenga en cuenta que scriptb.php solo se inicia después de que se sirva 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 se seguirá repitiendo para evitar que varios scripts se escriban en el mismo archivo de sesión y provoquen retrasos. Por lo tanto, se recomienda llamar a session_write_close() cuando ya no esté usando la sesión, especialmente en un sitio web que usa muchos iframes o AJAX.

mauris
fuente
4

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

Justin
fuente
3

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 se atenderán simultáneamente.

conceptoDawg
fuente