2010-05-16 5 views
5

Questa è una domanda trabocchetto, mentre sviluppando un'applicazione php + ajax mi sono sentito in alcune lunghe interrogazioni, non c'era niente di sbagliato in esse, ma potevano essere fatte in background.Come svuotare i dati in php e disconnettere l'utente mantenendo lo script vivo

So che c'è un modo per inviare una risposta all'utente mentre si esegue l'elaborazione reale a un altro processo da exec(), tuttavia non sembra corretto per me, questo potrebbe generare exploit e non è pratico fare è compatibile con server virtuali e multipiattaforma.

PHP offre le funzioni ob_ * anche se aiutano a svuotare la cache, ma l'utente manterrà la connessione finché lo script non sarà in esecuzione.

Mi chiedo se esiste un comando alternativo per eseguire uno script in esecuzione dopo l'invio di dati all'utente e la chiusura della connessione/thread con apache o un modo meno "sporco" per l'elaborazione dei dati inviati a un altro script.

+0

"Questa è una domanda trabocchetto"? –

+0

Davvero una buona domanda, stavo cercando questo, grazie. – PolishHurricane

risposta

1

Dopo aver fatto qualche ricerca ho trovato 3 risposte a questa domanda:

  1. fare una richiesta AJAX con un basso valore di timeout, una volta che viene raggiunto il timeout JS procederà alla fase successiva, mentre php, in background con ignore_user_abort abilitato, continuerà l'elaborazione.

  2. Separare i processi lenti dallo script che risponde direttamente all'utente eseguendo una risposta immediata o una risposta parziale (se possibile, a seconda dei casi), memorizzando le variabili di processo lente in un _SESSION o database, inviandolo al lavoratore da cURL con basso valore di timeout OPPURE avere un compito cron per chiamare i lavoratori.

  3. Utilizzare Gearman.

2

Quello che uso sui miei siti Web è Gearman.

Gearman consente di eseguire i task worker in background tramite la riga di comando. Questi operatori ascoltano le richieste per determinate attività e le elaborano quando ricevono una richiesta.

Sul lato dell'applicazione Web, faccio semplicemente $GEARMAN->doBackground("task_name","task_data"); e quindi l'attività viene inviata al worker e l'esecuzione ritorna immediatamente allo script.

È molto più sicuro di fare exec perché il task gearman funziona come una funzione PHP.

+1

Oh è grandioso, semplifica davvero le cose aggiungendo sicurezza – Rodrigo

0

PHP ha una funzione chiamata ignore_user_abort per questo.

È inoltre possibile memorizzare nel database una coda di attività da eseguire e fare in modo che l'attività cron controlli periodicamente nuove attività ed elaborale all'arrivo.

0

Ho una classe PHP che è un daemon POSIX. I avviarlo ed essenzialmente lo script ha

while(1) 
{ 
// run task 
} 

si può mettere chiamate al database e tutto nel ciclo - risponde a POSIX segnala anche - di solito impostato a dormire per 120 secondi e quindi eseguire di nuovo. Lo uso insieme a un tavolino che è la mia coda. Quindi, invece di usare un letale exec(), posso usare un'istruzione preparata più sicura per inserire un ID nella mia tabella della coda che lo script di sfondo catturerà nei prossimi 30 secondi.

avvertimento: eseguo il kill daemon e lo riavvio ogni 3 ore, a volte si blocca e non si elabora più, ma un semplice kill e start ogni 3 ore è un buon compromesso per ottenere le code in esecuzione

modificare non voglio pubblicare l'intero script, ma posso se qualcuno lo vuole

Problemi correlati