Domanda

In primo luogo,

il set up:

Ho uno script che esegue diverse operazioni dopo che un utente preme il pulsante "upload" che trasmette lo script i dati è sufficiente. Ora, questa parte è attualmente obbligatoria, non abbiamo la possibilità a questo punto per tagliare fuori l'upload e attingere da una fonte diretta.

In questa sezione viene intenzionalmente prolisso per fare un punto. Vai avanti se odiate che

In questo momento i dati vengono analizzati da una fonte davvero funky utilizzando espressioni regolari, poi suddiviso in una matrice. Si verifica quindi il DB per tutti i dati già in intervallo di date del dati caricati. Se gli intervalli di dati non sono già presenti nel DB, inserisce il successo dei dati e delle uscite per l'utente (c'è anche un po 'di controlli di sicurezza, la convalida origine dei dati, e la validazione di upload di base) ... Se i dati non esiste, lo script ottiene quindi i dati già nel DB, trova le differenze tra i due gruppi, cancella i dati vecchi che non corrisponde, aggiunge i nuovi dati, e quindi invia una e-mail ad ogni persona colpita da questi cambiamenti (uno per ogni e-mail persona con tutti i cambiamenti rilevanti nel detto e-mail, che è tutto un altro passo). Gli indirizzi e-mail vengono tirati per mezzo di una ricerca LDAP come il nostro DB ha la posta elettronica aziendale, ma il LDAP ha la loro e-mail personale che assicura che ottengono l'e-mail prima di venire nei prossimi giorni e farsi prendere inconsapevoli. Infine, i dati-Uploader è detto "Sono state apportate modifiche, messaggi di posta elettronica sono stati inviati". che è davvero tutto quello che si preoccupano.

Ora io possa essere l'aggiunta di un'API di Google Calendar che distacca i dati (quando è la programmazione dei dati) per l'utente di Google Calendar. Lo farei tramite il loro calendario di lavoro, ma ho pensato che avrei avuto le mie dita dei piedi bagnati con le API di Google prima di trattare con la creazione di un sistema di WebDav per Exchange.

</backstory>

Ora!

La questione pratica

A questo punto, l'integrazione pre-Google, lo script prende al massimo un secondo e mezzo per l'esecuzione. E 'abbastanza impressionante, almeno io la penso così (il server, non la mia codifica). Ma la punta di Google, nei test, è sloooow. Possiamo probabilmente rimediare, ma solleva la questione più grande ...

Qual è il modo migliore per off-caricare una parte del lavoro dopo che l'utente ha ottenuto la conferma che il DB è stato aggiornato? Questa è la parte che è più interessati e la parte più critica. Notifiche via email e aggiornamenti di Google Calendar sono lì solo per il beneficio di coloro che sono colpiti dalla caricati, e se c'è un problema con queste notifiche, si sentiranno su di esso (e poi ti sentono parlare di esso) a prescindere dalla sceneggiatura raccontare lui per primo.

Quindi, c'è un modo, per esempio, per eseguire un cronjob che è innescato da ultima esecuzione di uno script? Può PHP creare cronjobs con capacità exec()? C'è qualche modo normalizzato di gestire lavoro di post-esecuzione che ha bisogno sempre fatto?

Qualche consiglio su questo è molto apprezzato. Mi sento come gli script gonfiati-ness rispecchia il mio stadio di sviluppo e la necessità per me di sapere finalmente come fare divisione del lavoro nelle applicazioni web.

Ma ho anche capito preoccupato che questo non viene fatto, come necessità dell'utente di sapere quando tutte le attività vengano completate, ecc Quindi questo porta in primo piano:

Le migliori pratiche / domanda più soggettiva

In sostanza, c'è un idea che il progresso bar, in tempo reale, scarico e altri modi di mantenere l'utente legato allo script sono --quando combinata con l'ottimizzazione del codice, naturalmente-- il migliore, più-preferred metodo poi semplicemente dicendo "abbiamo finito con la vostra parte, se avete bisogno di noi, saremo notificare agli utenti" ecc ecc.

Ci sono grandi cose da evitare (diversi ovviamente non dare all'utente tutte le risposte a tutti)?

Grazie per la lettura. La parte di codifica è di fondamentale importanza, quindi non si sentono in dovere di coprire la seconda parte o si dimentica di coprire la parte di codifica!

È stato utile?

Soluzione

Ci sono un certo numero di modi per andare su questo. Si potrebbe exec (), come il precedente, dice, ma si potrebbe incorrere in una situazione DoS se ci sono troppi presentare clic. l'estensione PCNTL è probabilmente meglio a gestire i processi di questo tipo. Scopri questo post per vedere una discussione (ci sono 3 parti).

Si potrebbe utilizzare Javascript per inviare un secondo post, ajax che esegue lo script operaio appropriata dopo. Utilizzando ignore_user_abort () e l'invio di un Content-Length, il browser può staccare in anticipo, ma il processo di apache continuerà a funzionare ed elaborare i dati. Upside c'è potenziale forkbomb, lato negativo è che si aprirà processi più apache.

Ancora un'altra opzione è quella di utilizzare un cron in sottofondo che guarda una tabella dei processi-coda per le cose da fare 'tardi' - ti infili articoli in questa tabella sul front-end, rimuoverli sul backend durante l'elaborazione (vedi Zend_Queue ).

Ancora un altro è quello di utilizzare un quadro di lavoro più distribuito come gearmand -. In grado di elaborare gli elementi su altre macchine

Tutto dipende da vostre capacità e requisiti generali.

Altri suggerimenti

Un lavoro cron è buono per questo. Se tutto quello che vuoi fare quando un dato arrivi utente è dire "Ehi utente, grazie per i dati!" allora questo andrà bene.

Se si preferisce un approccio più immediato, quindi è possibile utilizzare exec() per avviare un processo in background. In un ambiente Linux sarebbe simile a questa:

exec("php /path/to/your/worker/script.php >/dev/null &");

La parte & dice "mi ha eseguito in backgound." La parte >/dev/null reindirizza l'output in un buco nero. Per quanto riguarda la gestione di tutti gli errori e le parti notificanti appropriate -. Questo è tutto fino alla progettazione del vostro script lavoratore

Per un approccio più flessibile multi-piattaforma, controlla questo posta Manuale

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