Pergunta

Eu tenho uma aplicação PHP que contém esses arquivos: landing.php, redirect.php, ajax.php

em uma chamada de página para landing.php , eu executar um código javascript para capturar determinados dados e emitir um AJAX POST para ajax.php que insere-los em DB . Finalmente php header () redirecionamentos para redirect.php

Atualmente, o recurso acima está usando o buffer de saída, mas o header () é executado muito cedo que o AJAX POST não é finished..ie, nenhuma consulta DB é feita.

Eu tentei usar sleep () usleep () antes de header () , mas eles não estão funcionando. Como eu não estou muito familiarizado com o buffer de saída, você poderia oferecer uma mão tipo?

Obrigado.

<?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();
?>
Foi útil?

Solução

Se eu entendi bem, você tem uma incompreensão fundamental sobre como aplicações web trabalho.

O seu script PHP não pode esperar para o AJAX pouco para executar, porque todo o script é executado pela primeira vez no servidor, ea saída - parte do qual a chamada AJAX é - é então enviado para o navegador. Você tem que repensar a forma como você está fazendo isso.

Por exemplo, você poderia ter o JavaScript primeiro fazer a chamada AJAX, e em seguida redirecionar o navegador.

Edit: OK, agora que eu pensei sobre isso por um tempo mais, eu posso ver como algo como isto pode trabalho quando você não estiver usando o buffer de saída, se o navegador executa o roteiro assim que vê-lo (sem ter a página inteira carregado). Se esse for realmente o caso, então você ainda está confiando em tempo do navegador, a qualidade da conexão de internet do usuário e assim por diante para manter as coisas em sincronia. Isso é decididamente não uma coisa boa.

No entanto, a única maneira que poderia funcionar é se a chamada AJAX foi exibida para o navegador antes de sua chamada de cabeçalho - o que não é possível! Cabeçalhos precisam ser enviados antes que o conteúdo da resposta HTTP (que é por isso que você está usando o buffer de saída em primeiro lugar), então ou você não vai emitir o JavaScript ou a chamada de cabeçalho irá falhar. Então, eu recomendo que você repensar a sua abordagem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top