Domanda

Ho un'applicazione PHP contenente questi file: landing.php, redirect.php, ajax.php

su una pagina chiamata a landing.php , eseguo un codice javascript per acquisire determinati dati e invio un POST AJAX a ajax.php che li inserisce nel DB . Infine php header () reindirizza a redirect.php

Attualmente la funzione sopra sta usando il buffering dell'output, ma la header () viene eseguita troppo presto in modo che il POST AJAX non sia terminato ... no, non viene fatta alcuna query DB.

Ho provato a usare sleep () usleep () prima di header () ma non funzionano. Dato che non ho molta familiarità con il buffering dell'output, potresti offrire una mano gentile?

Grazie.

<?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();
?>
È stato utile?

Soluzione

Se ti ho capito correttamente, hai un equivoco fondamentale sul funzionamento delle applicazioni Web.

Lo script PHP non può attendere l'esecuzione del bit AJAX, poiché l'intero script viene eseguito per la prima volta sul server e l'output - parte del quale è la chiamata AJAX - viene quindi inviato al browser. Devi ripensare il modo in cui lo stai facendo.

Ad esempio, potresti avere prima JavaScript che effettua la chiamata AJAX, quindi reindirizza il browser.

Modifica: OK, ora che ci ho pensato per un po 'di più, posso vedere come qualcosa come questo potrebbe funzionare quando non si utilizza il buffering dell'output, se il browser esegue il script non appena lo vede (senza caricare l'intera pagina). In tal caso, fai ancora affidamento sui tempi del browser, sulla qualità della connessione Internet dell'utente e così via per mantenere le cose sincronizzate. Questo è decisamente non una buona cosa.

Tuttavia, l'unico modo che potrebbe funzionare è se la chiamata AJAX è stata emessa nel browser prima della chiamata di intestazione, il che non è possibile! Le intestazioni devono essere inviate prima del contenuto nella risposta HTTP (motivo per cui stai utilizzando il buffering di output in primo luogo), quindi o non genererai JavaScript o la chiamata di intestazione fallirà. Quindi ti consiglio di ripensare il tuo approccio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top