2010-03-28 9 views
7

Originalmente, solo quiero verificar que session_start se bloquea en la sesión. Entonces, creo un archivo PHP como a continuación. Básicamente, si la vista de página es pareja, la página duerme durante 10 segundos; si la vista de página es impar, no es así. Y, session_start se usa para obtener la vista de página en $ _SESSION.¿Cómo se bloquea session_start en PHP?

Intenté acceder a la página en dos pestañas de un navegador. No es sorprendente que la primera pestaña demore 10 segundos ya que explícitamente la dejo dormir. La segunda pestaña no duerme, pero debe estar bloqueada por sessiont_start. Eso funciona como se esperaba

Para mi sorpresa, la salida de la segunda página muestra que session_start lleva casi ningún tiempo. En realidad, toda la página parece no tener tiempo para cargar. Pero la página tarda 10 segundos en mostrarse en el navegador.

obtained lock 
Cost time: 0.00016689300537109 
Start 1269739162.1997 
End 1269739162.1998 
allover time elpased : 0.00032305717468262 
The page views: 101 

¿El extracto de PHP session_start de página PHP y ejecutarlo antes de que otras declaraciones de PHP?

Este es el código.

<?php 

function float_time() 
{ 
    list($usec, $sec) = explode(' ', microtime()); 
    return (float)$sec + (float)$usec; 
} 

$allover_start_time = float_time(); 

$start_time = float_time(); 

session_start(); 

echo "obtained lock<br/>"; 
$end_time = float_time(); 

$elapsed_time = $end_time - $start_time; 
echo "Cost time: $elapsed_time <br>"; 
echo "Start $start_time<br/>"; 
echo "End $end_time<br/>"; 
ob_flush(); 
flush(); 


if (isset($_SESSION['views'])) 
{ 
    $_SESSION['views'] += 1; 
} 
else 
{ 
    $_SESSION['views'] = 0; 
} 

if ($_SESSION['views'] % 2 == 0) 
{ 
    echo "sleep 10 seconds<br/>"; 
    sleep(10); 
} 

$allover_end_time = float_time(); 
echo "allover time elpased : " . ($allover_end_time - $allover_start_time) . "<br/>"; 

echo "The page views: " . $_SESSION['views']; 

?> 
+1

Nota microtime (1) parámetro útil, haciendo que la función float_time sea obsoleta. –

+0

Compara los dos valores de 'Inicio'. ¿La segunda instancia "comienza" 10 segundos después de la primera? – VolkerK

+0

No puedo confirmar sus resultados. Al presionar Recargar en ambas pestañas para una solicitud pareja, primero corrí 10 segundos y otros 8 segundos como esperaba. Navegador Chrome, PHP5.2.5, Win –

Respuesta

4

Parece ser un "problema" relacionado con Firefox. Si solicita la misma URL en dos pestañas/ventanas, la segunda solicitud espera hasta que finalice la primera solicitud (también podría ser un complemento que bloquea la segunda solicitud, no lo ha probado).
tomar p.

<?php // test.php 
$start = microtime(true); 
echo "<pre>start: $start</pre>"; 
sleep(5); 
$end = microtime(true); 

echo '<pre>', $start, "\n", $end, "\n", $end-$start, '</pre>'; 

llamé dos veces y la salida estaba

start: 1269742677.6094 

1269742677.6094 
1269742682.609 
4.9995958805084 

y

start: 1269742682.6563 

1269742682.6563 
1269742687.6557 
4.9994258880615 

Tenga en cuenta que ya hay un segundo espacio de separación 5 entre las horas de inicio.

Cuando se llama como http://localhost/test.php y http://localhost/test.php?a=b en lugar de la misma URL dos veces, esto no sucede.
Tanto IE8 como Chrome no muestran ese comportamiento.

+0

¡Guau! ¡Tienes razón! ¿Como sabes eso? Nunca pensé que podría deberse al "problema" del navegador. –

+0

Eso fue más o menos por casualidad ;-) Falta – VolkerK

+1

en el ejemplo session_start(), que estaba allí en la pregunta original. has probado con eso? session_start() bloquea otras solicitudes de la misma sesión a menos que libere el bloqueo utilizando session_write_close(); http://www.php.net/manual/en/function.session-start.php#101452 – Murukesh

1

Sí, esto podría deberse a que session_start() bloquea otras solicitudes en la misma sesión (basado en archivos). Pude verificar el problema en Firefox (4.x) y Chrome (10.x) en Windows XP/PHP 5.2 con controlador de sesión (archivo) predeterminado. No estoy seguro de si este problema es reproducible para los manejadores de sesión que no sean archivos.

obtained lock 
**Cost time: 9.90100598335** 
Start 1303227658.67 
End 1303227668.57 
sleep 10 seconds 
allover time elpased : 19.9027831554 
The page views: 4 

Este es un tema muy interesante y el bloqueo pestaña de Firefox se describe en la respuesta anterior habría eclipsado éste sea detectado.

http://www.php.net/manual/en/function.session-start.php#101452

0

a partir de PHP no tiene un recipiente. ¿Cómo se serializan dos llamadas a la misma sesión? Quien hace esto? ¿Cómo hablan los dos procesos? ¿El módulo PHP está siempre activo y solo está generando subprocesos después de realizar la comprobación de la sesión? En ese caso, el módulo PHP se está comportando realmente como un contenedor que, en este caso, proporciona un servicio de administración de sesión en esta medida.