PHP usleep / sono dentro memória intermédia de saída
-
10-07-2019 - |
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();
?>
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.