¿Es el problema de este servidor http?

¿Es el problema de este servidor http?
<?php
    ob_start();
    echo 'test';
    ob_end_flush();
    flush();
    sleep(10);

Intenté generar una respuesta para la solicitud ajax antes de que finalice la conexión, pero no funcionó; esperará 10 segundos antes de obtener la respuesta con éxito. ¿Es el problema del servidor http, en mi caso Apache? Si eso es cierto, ¿cómo solucionarlo? ¿Que repita la respuesta de inmediato?

Respuesta1

Si bien flush()se supone que ob_end_flush()y ob_flush()garantiza que la salida se envíe al servidor, he descubierto que PHP a veces no es muy indulgente con una configuración de software particular.

Especialmente en Windows, el almacenamiento en búfer de salida puede ser complicado de configurar y la única forma que he encontrado que funciona de manera confiable entre sistemas es restablecer el almacenamiento en búfer de salida en cada descarga de esta manera:

<?php
obf_start();

for($i=0;$i<70;$i++) {
    echo 'printing... ', microtime(true), '<br />';

    if($i % 3 == 2) obf_flush();

    usleep(300000);
}

function obf_start() {
    ob_start();
}

function obf_flush() {
    ob_end_flush();
    ob_flush();
    flush();
    obf_start();
}

¿Es una solución fea? Sí, lo es. Pero hastatodos los errores relacionados con el almacenamiento en búfer de salidaestán solucionados, no veo que esta solución vaya a desaparecer en el código de producción en el corto plazo.

También tenga en cuenta que algunos programas antivirus (Panda AV y otros) y servidores proxy retendrán todos los datos hasta que se cierre el socket. No puede garantizar que todos los clientes recibirán los datos eliminados adecuados.

Respuesta2

La forma más sencilla de saber si algo es un problema del servidor o del navegador/biblioteca es monitorear la solicitud en vivo. Las 2 formas más sencillas de hacer esto en su caso son:

  • insecto de fuego: Esta extensión de Firefox le mostrará todas sus solicitudes AJAX en vivo a medida que se envían y le mostrará la respuesta tan pronto como la reciba el navegador.
  • Captura de tráfico: utilice una herramienta como Wireshark para ver cualquier tipo de solicitud enviada y el tráfico TCP que regresa del servidor en tiempo real.

Si ve que los datos regresan de inmediato pero tardan 10 segundos en mostrarse, su navegador o biblioteca AJAX está esperando a que se cierre la conexión antes de procesar la respuesta. Si pasan 10 segundos antes de que reciba algo, su servidor o módulo PHP tiene la culpa.

información relacionada