ob_flush
scrive il buffer. In altre parole, ob_flush
indica a PHP di fornire ad Apache (o nginx/lighttpd/qualunque) l'output e quindi a PHP di dimenticarsene. Una volta che Apache ha l'output, fa quello che vuole con esso. (In altre parole, dopo ob_flush
è fuori dal tuo controllo se viene o meno scritto immediatamente nel browser).
Quindi, risposta breve: non esiste un modo garantito per farlo.
Solo un'ipotesi, probabilmente stai cercando AJAX. Ogni volta che le persone cercano di manipolare quando il contenuto della pagina viene caricato come si sta facendo, AJAX è quasi sempre il percorso corretto.
Se si desidera continuare un'attività in background, è possibile utilizzare ignore_user_abort
, come dettagliato here, tuttavia, che spesso non è l'approccio ottimale. In pratica, si perde il controllo su quel thread e, a mio parere, un thread del server Web non è il luogo in cui l'elaborazione pesante appartiene.
Proverei a estrarlo dal web. Questo potrebbe significare una voce di cron o semplicemente generare un processo in background dall'interno di PHP (un processo che sebbene avviato dall'esecuzione dello script non morirà con lo script, e lo script non aspetterà che finisca prima di morire).
Se si va su quella rotta, ciò significa che è anche possibile creare una sorta di sistema di stato se necessario. Quindi è possibile monitorare l'esecuzione e fornire all'utente aggiornamenti periodici sullo stato di avanzamento. (Tecnicamente potresti creare un sistema di stato con uno script ignore_user_abort
, ma non mi sembra così pulito.)
Dopo aver eseguito il primo ob_flush, vuoi visualizzare altri output? O vuoi che la richiesta sia completamente finita per quanto il cliente possa dirlo e poi qualche tipo di elaborazione continua in background? – Corbin
continua in background – aWebDeveloper
Ok, ho aggiornato la mia risposta. – Corbin