
Estoy programando una página web PHP y comencé a ver un comportamiento extraño en mi computadora, en algún momento apache/php tarda demasiado en mostrar la página web en el navegador (8 segundos), primero pensé que era mi aplicación la que tenía un error, así que hice una función de depuración para realizar un seguimiento del tiempo necesario para terminar mi script, pero cuando comencé a recargar la página varias veces (presionando F5) noté que no era mi script sino algún otro proceso lo que detiene apache ( o php, o mysql) y luego lo suelta porque presionar F5 varias veces muestra que a veces el script termina rápido y otras veces tarda mucho:
[time_start] => Array
(
[0] => 1446841239.1471
[1] => 0.0581
[2] => 0.0589
[3] => 0.0564
[4] => 8.0531
[5] => 0.0574
[6] => 0.0621
[7] => 8.0582
[8] => 0.0548
[9] => 8.0457
[10] => 0.0755
[11] => 8.0555
[12] => 0.0512
[13] => 8.0447
[14] => 0.062
[15] => 8.0905
[16] => 0.0602
[17] => 8.0556
[18] => 0.0582
[19] => 8.0492
[20] => 0.0551
)
Cada paso es el mismo script que se ejecuta después de presionar F5, y siempre debería tomar el mismo tiempo, pero a veces tarda 8 segundos en finalizar, y eso me molesta porque cuando se detiene SIEMPRE tarda unos 8 segundos.
Entonces la pregunta es, ¿alguna idea sobre cómo puedo encontrar el proceso que está deteniendo mi script?
Ps.- Estoy ejecutando muchas cosas en primer plano porque es mi computadora personal, pero incluso cuando solo uso el navegador sin ninguna otra aplicación en ejecución, todavía se bloquea, por lo que tiene que ser algo ejecutándose en segundo plano, ¿cómo puedo encontrarlo? ?
Respuesta1
Un tiempo constante de 8 segundos implica que algún procedimiento potencialmente de larga duración tiene un tiempo de espera establecido. Sin saber qué hace el código PHP, supongo que tienes una hora de DNS. Si PHP está realizando alguna E/S de red o algo así, probablemente active una búsqueda de DNS. De vez en cuando, ves que se agota el tiempo de espera de una consulta DNS y PHP continúa haciendo lo que sea que haga en esa eventualidad.
El único lugar donde puedo ver que se establecen los tiempos de espera de DNS es en /etc/resolv.conf
, o tal vez cuando resolver(3)
se compila el código en GNU libc. Desafortunadamente, la página de manual resolv.conf
afirma que un tiempo de espera de 5 segundos es el valor predeterminado compilado, por lo que solo puedo decir que estoy adivinando esto.