Pregunta

Tengo una aplicación PHP que contiene estos archivos: landing.php, redirect.php, ajax.php

en una llamada de página a landing.php , ejecuto un código javascript para capturar ciertos datos y emito un mensaje AJAX POST a ajax.php que los inserta en DB . Finalmente php header () redirige a redirect.php

Actualmente, la función anterior está utilizando el almacenamiento en búfer de salida, pero el encabezado () se ejecuta demasiado pronto que la POST AJAX no está terminada ... es decir, no se realiza ninguna consulta de base de datos.

Intenté usar sleep () usleep () antes de header () pero no funcionan. Como no estoy muy familiarizado con el búfer de salida, ¿podría ofrecer una mano amable?

Gracias.

<?php ob_start(); ?>

<scripts type="text/javascript">
var data = 'blah..blah..blah..';
ajaxPost('ajax.php', data);
</scripts>

<?php
sleep(2);    // <---- I want the script to sleep here and wait for the AJAX to finish
header('c.php)
ob_end_flush();
?>
¿Fue útil?

Solución

Si te entendí correctamente, tienes un malentendido fundamental sobre cómo funcionan las aplicaciones web.

Su script PHP no puede esperar a que se ejecute el bit AJAX, porque todo el script se ejecuta primero en el servidor y la salida, parte de la cual es la llamada AJAX, se envía al navegador. Tienes que repensar la forma en que lo haces.

Por ejemplo, puede hacer que JavaScript primero realice la llamada AJAX y luego redirija el navegador.

Editar: OK, ahora que he pensado en esto por un tiempo más, puedo ver cómo algo como esto podría funcionar cuando no está utilizando el búfer de salida, si el navegador ejecuta el script tan pronto como lo vea (sin tener la página completa cargada). Si ese es el caso, entonces todavía depende del tiempo del navegador, la calidad de la conexión a Internet del usuario, etc. para mantener las cosas sincronizadas. Eso es decididamente no algo bueno.

Sin embargo, la única forma en que podría funcionar es si la llamada AJAX saliera al navegador antes de la llamada de encabezado, ¡lo cual no es posible! Los encabezados deben enviarse antes del contenido en la respuesta HTTP (por lo que está utilizando el almacenamiento en búfer de salida en primer lugar), por lo que no generará el JavaScript o la llamada del encabezado fallará. Por lo tanto, le recomiendo que reconsidere su enfoque.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top