Precisión del sueño de PHP

Utilizo el siguiente código para ver cuánto tiempo está un usuario en una página en particular. Utilizo una imagen oculta con un atributo src para este script:

$timer_seconds = 1;

while(!connection_aborted()) { 
   echo "\n";
   flush();
   sleep(1);
   $timer_seconds++;
}

¡A veces encuentro que esto puede ser de 5 a 10 segundos! ¿Supongo que es la carga del servidor lo que afecta el tiempo?

¿Hay alguna forma de que pueda hacer esto exacto?

Gracias a todos por cualquier ayuda.

preguntado el 08 de enero de 11 a las 23:01

Es tan molesto cuando los sitios web hacen esto. -

@chris Me estoy perdiendo algo obvio ... ¿Por qué es molesto? ¿Porque la página nunca deja de cargarse? -

Ya. No estoy seguro de por qué, pero me molesta que la página nunca termine de cargarse, incluso si funciona correctamente. -

+1 para la estima de la carga de trabajo del trabajo filosófico: just giv the server get its deserved break will ya? y deje que se cargue cuando esté cargado y no lo prolongue artificialmente. -

6 Respuestas

echo y flush puede llevar tiempo, por lo que su bucle duerme durante 1 segundo + el tiempo dedicado echo y flush. Prueba algo como:

$begin_time = time();
$elapsed_time = 0;

while(!connection_aborted()) {
  echo "\n";
  flush();
  sleep(1);
  $elapsed_time = time() - $begin_time;
}

Respondido el 09 de enero de 11 a las 02:01

¡Parece una buena idea, pero probé lo anterior y parece que todavía está apagado por segundos! Su lógica es correcta, pero ¿qué más puede hacer que el tiempo transcurrido sea de segundos? - Abs

Probablemente debería usar Javascript para hacer esto. Por ejemplo, solicite algo del cliente (usando Ajax o una solicitud de imagen) en el evento de descarga del documento.

Respondido el 09 de enero de 11 a las 02:01

Usando jQuery podría hacer una llamada ajax sincrónica onbeforeunload (Yo se que no es exactamente ajax) para saber cuánto tiempo estuvo el usuario en la página.

La verdad del asunto es que realmente no te dice mucho de nada. El hecho de que alguien esté en una página no significa que esté mirando la página. El hecho de que vean la página muy brevemente no significa que tampoco les guste.

Respondido el 09 de enero de 11 a las 03:01

No puedo usar AJAX, esto debe lograrse en la carga de una página. - Abs

No tu no tener para lograr esto en la carga de una página, quieres para lograr esto en la carga de una página. Solo recuerde que va a estropear la experiencia del usuario cuando intente hacer algo tan ridículo como continuar transmitiendo datos al cliente. También atascará los recursos de su servidor cuando tenga varios usuarios en el sitio al mismo tiempo. - zzzzBov

Tienes algunas buenas herramientas (en javascript) para hacer eso.

http://chartbeat.com

http://analytics.google.com

Estos son algunos de los que se utilizan en la empresa en la que trabajo.

Respondido el 23 de enero de 11 a las 10:01

No hay una forma confiable de hacer esto desde el servidor.

Respondido el 09 de enero de 11 a las 02:01

como dijo @erjiang, echo y flush toman tiempo y luego pones el script a dormir ... así que si para flush se necesitaba 1 segundo y luego duermes 1 segundo, eso es 2 segundos y ¡agregas solo uno!

La solución sería escribir una hora de inicio y finalización y luego encontrar la diferencia:

$start = time();

while(!connection_aborted()){ 
  echo "\n"; //probably not needed...
  flush(); //same probably not needed :)
  sleep(1); //so just a sleep to not continue the code
}

$end = time();
$diff = $end - $start;
$days=floor($diff/86400);
$hours=floor(($diff-($days*86400))/3600);
$minutes=floor(($diff-(($days*86400)+($hours*3600)))/60);
$secconds=floor(($diff-((($days*86400)+($hours*3600))+($minutes*60))));

echo "\n\n".$hours."/".$minutes."/".$secconds;

eso lo hará! ;)

Respondido el 23 de enero de 11 a las 22:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.