Chrome net::ERR_INCOMPLETE_CHUNKED_ENCODING error

Desde hace dos meses, recibo el siguiente error en la consola de desarrolladores de Chrome:

net::ERR_INCOMPLETE_CHUNKED_ENCODING

Síntomas:

  • Las páginas no se cargan.
  • Archivos CSS y JS truncados.
  • Páginas colgadas.

Entorno del servidor:

  • Apache 2.2.22
  • PHP
  • Ubuntu

Esto me ocurre en nuestro servidor Apache interno. No le ocurre a nadie más, es decir, ninguno de nuestros usuarios está experimentando este problema, ni tampoco nadie de nuestro equipo de desarrollo.

Otras personas están accediendo al mismo servidor con la misma versión de Chrome. También he probado a desactivar todas las extensiones y a navegar en modo incógnito, pero no ha surtido efecto.

He utilizado Firefox y ocurre exactamente lo mismo. Archivos truncados y demás. Lo único es que Firefox no genera ningún error en la consola, así que hay que inspeccionar la petición HTTP a través de Firebug para ver el problema.

Cabeceras de respuesta de Apache:

Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection:close
Content-Encoding:gzip
Content-Type:text/html; charset=utf-8
Date:Mon, 27 Apr 2015 10:52:52 GMT
Expires:Thu, 19 Nov 1981 08:52:00 GMT
Pragma:no-cache
Server:Apache/2.2.22 (Ubuntu)
Transfer-Encoding:chunked
Vary:Accept-Encoding
X-Powered-By:PHP/5.3.10-1ubuntu3.8

Mientras probaba, pude arreglar el problema forzando HTTP 1.0 en mi archivo htaccess:

SetEnv downgrade-1.0

Esto elimina el problema. Sin embargo, forzar HTTP 1.0 sobre HTTP 1.1 no es una solución adecuada.

Actualización: Debido a que soy el único que experimenta este problema, pensé que tenía que pasar más tiempo investigando si era o no un problema del lado del cliente. Si entro en la configuración de Chrome's y uso la opción "Restaurar a los valores predeterminados", el problema desaparecerá durante unos 10-20 minutos. Luego vuelve a aparecer.

Solución

BIEN. He hecho tres pruebas y estoy 100% seguro de que la causa es mi antivirus (ESET NOD32 ANTIVIRUS 5).

Siempre que desactivo la protección en tiempo real, el problema desaparece. Hoy, he dejado la protección en tiempo real desactivada durante 6-7 horas y el problema no se ha producido.

Hace unos momentos, la he vuelto a activar y el problema ha vuelto a surgir en un minuto.

En el transcurso de las últimas 24 horas, he activado y desactivado la protección en tiempo real para asegurarme. El resultado ha sido siempre el mismo.

Actualización: He encontrado a otro desarrollador que tenía exactamente el mismo problema con la protección en tiempo real de su antivirus Kaspersky. Lo desactivó y el problema desapareció. Es decir, este problema no parece estar limitado a ESET.

Comentarios (11)

El error trata de decir que Chrome se cortó mientras se enviaba la página. Su problema es tratar de averiguar por qué.

Aparentemente, esto podría ser un problema conocido que afecta a un par de versiones de Chrome. Por lo que puedo decir, es un problema de estas versiones que son masivamente sensibles a la longitud del contenido del trozo que se está enviando y al tamaño expresado de ese trozo (podría estar muy equivocado en esto). En resumen, un problema de cabeceras ligeramente imperfectas.

Por otro lado, podría ser que el servidor no envíe el chunk de longitud 0 terminal. Lo cual podría arreglarse con ob_flush();. También es posible que Chrome (o la conexión o algo) esté siendo lento. Así que cuando la conexión se cierra, la página aún no está cargada. No tengo ni idea de por qué puede ocurrir esto.

Aquí está la respuesta de los programadores paranoicos:

<?php
    // ... your code
    flush();
    ob_flush();
    sleep(2);
    exit(0);
?>

En su caso, podría ser un caso de la secuencia de comandos de tiempo fuera. No estoy muy seguro de por qué debería afectar sólo a usted, pero podría ser a un montón de condiciones de carrera? Eso es una suposición absoluta. Deberías poder comprobarlo ampliando el tiempo de ejecución del script.

<?php
    // ... your while code
    set_time_limit(30);
    // ... more while code
?>

También puede ser tan simple como que necesitas actualizar tu instalación de Chrome (ya que este problema es específico de Chrome).

Actualización: Pude replicar este error (por fin) cuando se lanzó un error fatal mientras PHP (en el mismo localhost) estaba almacenando la salida en el buffer. Imagino que la salida estaba demasiado maltratada para ser de mucha utilidad (cabeceras pero poco o ningún contenido).

Específicamente, accidentalmente tenía mi código llamándose a sí mismo recursivamente hasta que PHP, con razón, se rindió. Así, el servidor no envió el trozo de longitud 0 de la terminal - que era el problema que identifiqué antes.

Comentarios (3)

Lo siguiente debería solucionarlo para todos los clientes.

<?php

//Gather output (if it is not already in a variable, use ob_start() and ob_get_clean() )    

// Before sending output:
header('Content-length: ' . strlen($output));

Pero en mi caso lo siguiente era una mejor opción y lo arreglaba también:

.htaccess:

php_value opcache.enable 0
Comentarios (4)