Mi script es llamado por el servidor. Del servidor recibiré ID_OF_MESSAGE
y TEXT_OF_MESSAGE
.
En mi script, manejaré el texto entrante y generaré una respuesta con params: ANSWER_TO_ID
y RESPONSE_MESSAGE
.
El problema es que estoy enviando una respuesta a ining "ID_OF_MESSAGE"
, pero el servidor que me envía un mensaje para manejar establecerá su mensaje como entregado a mí (significa que puedo enviarle una respuesta a esa ID), después de recibir la respuesta http 200.
Una de las soluciones es guardar el mensaje en la base de datos y hacer un cron que se ejecutará cada minuto, pero necesito generar un mensaje de respuesta de inmediato.
¿Hay alguna solución para enviar al servidor la respuesta http 200 y continuar ejecutando el script php?
Muchas gracias
header("Content-Encoding: none")
fastcgi_finish_request()
al finalHe visto muchas respuestas aquí que sugieren usar,
ignore_user_abort(true);
pero este código no es necesario. Todo lo que hace es asegurarse de que su script continúe ejecutándose antes de que se envíe una respuesta en caso de que el usuario cancele (cerrando su navegador o presionando escape para detener la solicitud). Pero eso no es lo que estás preguntando. Estás pidiendo continuar con la ejecución DESPUÉS de que se envíe una respuesta. Todo lo que necesitas es lo siguiente:Si le preocupa que su trabajo en segundo plano lleve más tiempo que el límite de tiempo de ejecución del script predeterminado de PHP, quédese
set_time_limit(0);
en la parte superior.fuente
Si está utilizando el procesamiento FastCGI o PHP-FPM, puede:
Fuente: https://www.php.net/manual/en/function.fastcgi-finish-request.php
Problema de PHP # 68722: https://bugs.php.net/bug.php?id=68772
fuente
Pasé algunas horas en este tema y he venido con esta función que funciona en Apache y Nginx:
Puede llamar a esta función antes de su largo procesamiento.
fuente
filter_input
función que a veces devuelve NULL. vea esta contribución del usuario para más detallesModificó un poco la respuesta de @vcampitelli. No crea que necesita el
close
encabezado. Veía encabezados cerrados duplicados en Chrome.fuente
Utilizo la función php register_shutdown_function para esto.
http://php.net/manual/en/function.register-shutdown-function.php
Editar : lo anterior no funciona. Parece que me engañó alguna documentación antigua. El comportamiento de register_shutdown_function ha cambiado desde PHP 4.1 link link
fuente
No puedo instalar pthread y ninguna de las soluciones anteriores me funciona. Encontré solo la siguiente solución para funcionar (ref: https://stackoverflow.com/a/14469376/1315873 ):
fuente
en caso de uso de php file_get_contents, el cierre de la conexión no es suficiente. php todavía espera a que eof lo envíe el servidor.
mi solución es leer 'Content-Length:'
aquí está la muestra:
response.php:
Tenga en cuenta "\ n" en respuesta a la línea de cierre, si no, fget read mientras espera eof.
read.php:
Como puede ver, este script no debe esperar unos segundos si se alcanza la longitud del contenido.
espero que ayude
fuente
Le hice esta pregunta a Rasmus Lerdorf en abril de 2012, citando estos artículos:
Sugerí el desarrollo de una nueva función incorporada de PHP para notificar a la plataforma que no se generarán más resultados (¿en stdout?) (Tal función podría encargarse de cerrar la conexión). Rasmus Lerdorf respondió:
¡Puedo ver su punto y apoyar su opinión para algunas aplicaciones / escenarios de carga! Sin embargo, en algunos otros escenarios, las soluciones de vcampitelli et al, son buenas.
fuente
Tengo algo que puede comprimir y enviar la respuesta y dejar que se ejecute otro código php.
fuente
Hay otro enfoque y vale la pena considerarlo si no desea alterar los encabezados de respuesta. Si inicia un hilo en otro proceso, la función llamada no esperará su respuesta y volverá al navegador con un código http finalizado. Deberá configurar pthread .
Una vez que ejecutamos $ continue_processing-> start () PHP no esperará el resultado de retorno de este hilo y, por lo tanto, se considerará rest_endpoint. Se hace.
Algunos enlaces para ayudar con pthreads
Buena suerte.
fuente
Sé que es antiguo, pero posiblemente útil en este momento.
Con esta respuesta no apoyo la pregunta real sino cómo resolver este problema correctamente. Espero que ayude a otras personas a resolver problemas como este.
Sugeriría usar RabbitMQ o servicios similares y ejecutar la carga de trabajo en segundo plano utilizando instancias de trabajador . Hay un paquete llamado amqplib para php que hace todo el trabajo para que usted use RabbitMQ.
Pros:
Neg's:
fuente