2011-12-01 11 views
5

Me estoy conectando desde un dispositivo Android usando java a un servidor que ejecuta PHP usando DefaultHttpClient.Detecta el tiempo de espera de la conexión del cliente de android java desde PHP

Una prueba que estoy haciendo es verificar que el código de java se maneja con elegancia si el servidor demora en enviar los datos. Si tarda mucho, se desconecta y vuelve a intentar.

Actualmente He fijado el tiempo de espera de conexión con 3 segundos por:

HttpConnectionParams.setSoTimeout(httpParameters, 3000); 

En el servidor de la secuencia de comandos PHP está durmiendo durante 10 segundos:

sleep(10); 

El código java funciona, si la secuencia de comandos toma más de 3 segundos y arroja una java.net.SocketTimeoutException y luego vuelve a intentarlo después de una pequeña cantidad de tiempo.

El script PHP continúa ejecutándose, que es no lo que quiero. Intenté probar usando connection_aborted directamente después de la función sleep, pero no detecta la desconexión del cliente que ya sucedió.

ignore_user_abort(true); 
sleep(10); 
print "black hole"; 
flush(); 
if(connection_aborted()!=0){ 
     // You would think this works but it does not. 
} 

¿Cuál es la forma recomendada de manejar esto?

+0

Lo que hace el código php aspecto relevante como? – Phil

+0

@Phil la única línea simple para dormir durante 10 segundos. – zaf

+0

@Phil He agregado mi intento con connection_aborted – zaf

Respuesta

0

No estoy seguro si es lo mismo ahora, pero hace mucho tiempo me encontré con php sin darme cuenta de que la conexión se interrumpió hasta que realmente intentó escribir o eliminar sus búfers de salida. Ver flush flush() y ob_flush(); No necesitaba escribir nada en la salida, bastaba con vaciar buffers vacíos para comprobarlo.

Me imagino que los servidores web y otras cosas en frente de php podrían afectar este comportamiento.

Es probable que ya haya llamado ignore_user_abort (true); de lo contrario, php probablemente detenga la ejecución en la llamada flush() (el comportamiento predeterminado es detenerse cuando se da cuenta de que la conexión se ha ido), por lo que su sentencia if nunca se ejecutará.

+0

Sí, parece apuntar al hecho de que el script de suspensión simple no ha generado nada. Veamos si una llamada para purgar antes de que la función connection_abort lo active. – zaf

+0

Mi intento falló. Ver mi pregunta con código actualizado. – zaf

-1
print 
"black hole"; 
flush(); 
if(connection_aborted()!=0){ 
     // You would think this works but it does not. 
    } 

En realidad, no se podría pensar que eso funcionaría, ya que requeriría que el script php para llegar a ese punto en el guión. Si lo escribió al final, entonces el script debe seguir su curso.

que sugeriría su lugar:

for($i=0;$i<10;$i++){ 
    echo ' '; ## echo "\0"; might also work 
    flush(); 
    if(connection_aborted()!=0){ 
      // You would think this works but maybe it will now. 
      die(); 
     } 
    sleep(1); # the sleep should come after the check 
} 

darle una oportunidad. Está claro que está tratando de dormir durante 10 segundos y luego matar el script ... en todos los casos ese script se ejecutará durante 10 segundos.

2

De hecho, escribí un artículo sobre este mismo tema no hace mucho tiempo, daré una breve respuesta aquí, y asumir que está bien también publicar un enlace relacionado?

Esencialmente, PHP solo descubrirá que un cliente remoto se ha desconectado cuando intenta usar el socket que está conectado a ese socket remoto, hasta que le pida que haga algo con ese socket asumirá que todo está bien.Aquí está el código que utilizo para comprobar si hay desconexiones remotas:

public function isAlive(){ 
     $res = @socket_recv($this->sockHandle, $data, 1024, MSG_PEEK); 
     if($res === 0){ 
     return false; 
     }else{ 
     return true; 
     } 
} 

La parte importante aquí es la MSG_PEEK deja algún mensaje pendiente de que se eliminará, y la "@" mudos errores si el enchufe está bien, pero no hay mensajes estan pendientes.

Para el artículo completo, está disponible aquí:

http://www.bracketbrotherhood.com/remote-disconnections-php-non-blocking-server-sockets/programming-and-development/

Saludos, Phil ,

+0

Buen artículo para leer y gracias por la respuesta. Ya saqué el código, así que me puede llevar algo de tiempo probar tus ideas. – zaf

Cuestiones relacionadas