2008-08-21 27 views
15

Estoy ejecutando Apache en Linux dentro de VMWare.sleep() silencia silenciosamente la CPU

Una de las páginas PHP que estoy solicitando hace un sleep(), y me parece que si intento para solicitar una segunda página, mientras que la primera página es sleep()'ing, la segunda página se bloquea, esperando el sleep() desde la primera página hasta terminar.

¿Alguien más ha visto este comportamiento?

sé que no es PHPmulti-hilo, pero esto parece mal manejo bruto de la CPU.

Editar: Debería haber mencionado que el uso de la CPU no aumenta. Lo que quiero decir con CPU "acaparando" es que ninguna otra página PHP parece capaz de usar la CPU mientras la página está inactiva().

+0

¿Alguna vez encontró una solución para esto? Estoy teniendo el mismo problema. –

Respuesta

1

¿Realmente ve que la CPU va al 100% o simplemente que no se están sirviendo otras páginas? ¿Cuántas instancias de apache está ejecutando? ¿Se están parando todos cuando ejecutas sleep() en de of the threads?

La función sleep() de PHP esencialmente se ejecuta a través de un ciclo inactivo durante n segundos. No libera ninguna memoria, pero no debería aumentar significativamente la carga de la CPU.

4

Lo que esto significa probablemente es que su Apache solo está utilizando el proceso 1 niño.

Por lo tanto:

El proceso hijo 1 es el manejo de una solicitud (en este caso para dormir pero podría estar haciendo un trabajo real, Apache no puede decir la diferencia), por lo que cuando llega una nueva petición de ella, lo hará tiene que esperar hasta que termine el primer proceso.

La solución sería aumentar el número de procesos secundarios que Apache puede generar (directiva MaxClients si está utilizando el MPM prefork), simplemente elimine el comando sleep() del script PHP.

Sin saber exactamente qué está pasando en su script es difícil de decir, pero probablemente pueda deshacerse de la suspensión().

+0

Has domado un poco la idea con la palabra "probablemente", pero todavía no veo cómo puedes justificar esperar poder eliminar fragmentos de código que nunca has visto sin romper las cosas. – JoeBloggs

+3

Lo siento, no dije mi comentario con más claridad. No quise decir que podría deshacerse de la suspensión y la aplicación seguiría funcionando. Quise decir que con toda probabilidad el sueño() no está ahí por una buena razón, y la aplicación probablemente podría reescribirse para funcionar sin el modo reposo(). – rix0rrr

10

Podría ser que la página llamada abra una sesión y luego no la confirme, en este caso consulte this answer para encontrar una solución.

+4

Si tiene php.ini configurado con session.auto_start establecido en 1, abrirá la sesión antes de ejecutar cualquier código, y lo mantendrá abierto hasta que lo cierre explícitamente, o la página llegue al final. La segunda solicitud aparentemente se bloqueará incluso antes de ejecutar la primera línea de código. –

+2

En mi caso, al llamar 'session_write_close()' antes de comenzar el ciclo impidió 'sleep' bloquear el acceso a otras páginas en el servidor. – thirdender