2009-09-16 14 views
78

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?Solicitudes simultáneas al script PHP

  • ¿Las solicitudes se pondrán en cola?
  • ¿Serán ignorados?
  • ¿Cada solicitud tendrá su propia secuencia de comandos instancia?
  • ¿Alguna otra posibilidad?
+1

También verifique esta respuesta: http://konrness.com/php5/how-to-prevent-blocking-php-requests/ – trante

Respuesta

128

El servidor, dependiendo de su configuración, en general, puede servir cientos de solicitudes al mismo tiempo - si se utiliza Apache, la opción de configuración MaxClients es el que dice:

El La directiva MaxClients establece el límite de en el número de solicitudes simultáneas que se atenderán.
Cualquier intento de conexión sobre el límite MaxClients normalmente será en cola, hasta un número basado en la directiva ListenBacklog.
Una vez que un proceso niño se libera al final de una solicitud diferente , la conexión será luego se realizará el mantenimiento.


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

Así:

se pondrá en cola las peticiones?

No; excepto si:

  • hay cierta bloqueo alguna parte - que puede suceder, por ejemplo, si las dos solicitudes proceden de un mismo cliente, y está utilizando sesiones basadas en archivos en PHP: mientras que una script se está ejecutando, 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 usar el archivo para abrir la sesión por 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 de MaxClients procesos actualmente activos - vea la cita del manual de Apache justo antes.


Van a ser ignorados?

No: esto significa 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 usted estaba presionando F5 en el mismo momento para ver si alguien respondió!
(Bueno, por lo que no es en PHP, pero los principios son los mismos)


Cualquier otra posibilidad?

Sí ^^


edición después que ha editado el OP y el comentario:

Será cada solicitud tiene su propia instancia de la escritura ?

No hay tal cosa como "ejemplo guión": en pocas palabras, lo que está sucediendo cuando una solicitud a un script se hace es:

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


Realmente, puede tener dos usuarios envían una solicitud para el mismo script PHP (o scripts PHP distintivas que incluyen el mismo archivo PHP); eso definitivamente no es un problema, ¡o ninguno del sitio web en el que trabajé funcionaría!

+0

Si múltiples solicitudes simultáneas están accediendo al mismo archivo php, cuál sería el resultado. ¿las otras solicitudes se mantendrán pendientes o cada solicitud tendrá su propia instancia de script? –

+3

No existe tal cosa como "instancia de script": cada solicitud es procesada por un proceso distinto (o hilo) ;; los scripts se leen desde la memoria/disco, pero el mismo archivo se puede leer de muchos procesos al mismo tiempo sin problemas (al menos, en sistemas operativos "modernos", es decir, tanto Windows como Linux) –

+0

Esta es una respuesta excelente , ¿dónde podría aprender más detalles sobre cómo funciona PHP? ¿Algún buen libro para esto? –

2

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 ingrese al servidor. Las solicitudes simultáneas serán atendidas simultáneamente.

17

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 a nivel de navegador.

Es 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, como 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 una secuencia de comandos.

Mire este ejemplo. Los 2 archivos se cargan desde la misma sesión, también conocido como el mismo usuario del navegador.

 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 se bloquea a otras secuencias de comandos para que scripta.php pueda escribir en el archivo de la 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 repetirá para evitar que las secuencias de comandos múltiples que escriben en el mismo archivo de sesión causen retrasos. Por lo tanto, se recomienda llamar al session_write_close() cuando ya no esté utilizando la sesión, especialmente en un sitio web que usa muchos iframes o AJAX.

+0

'session_write_close()' ¡De acuerdo, hombre bien hecho! – TechNyquist

2

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

Cuestiones relacionadas