2010-09-21 7 views
5

Vedere anche Having a PHP script loop forever doing computing jobs from a queue system, ma questo non risponde a tutte le mie domande.Avere uno script PHP eseguito per sempre, accedere a una coda

Se voglio eseguire uno script PHP per sempre, l'accesso a una coda e facendo i lavori:

  1. Qual è il potenziale per problemi di memoria? Come evitarli? (qualsiasi funzione di svuotamento o qualcosa che dovrei usare?)

  2. Cosa succede se la sceneggiatura muore per qualche motivo? Quale sarebbe un buon metodo per riavviarlo automaticamente?

  3. Quale sarebbe il miglior approccio di base per avviare lo script. Dal momento che funziona per sempre, non ho bisogno di cron. Ma come posso avviarlo? (Vedi anche 2.)

+0

1. Dipende da cosa stai facendo. Alcune estensioni hanno alcune perdite di mem seria. - 2. Utilizzare una sorta di guardia del tempo. - 3. forchetta() sullo sfondo. – halfdan

+0

Che cosa sarà esattamente impegnato a fare per sempre? Come mai * avrà * del lavoro da fare? Quando scarica la coda, cosa fa allora? E perché PHP? – Dolph

risposta

9

Impostare la coda come uno script di cron. Fallo eseguire ogni 10 secondi. Quando lo script si attiva, controlla se è presente un file di lock (qualcosa come .lock). Se c'è, esci immediatamente. In caso contrario, creare il .lock e avviare l'elaborazione. Se si verificano errori, invia/registra questi errori, cancella .lock e esci. Se non ci sono compiti, quindi esci.

Penso che questo approccio sia l'ideale, dal momento che PHP non è realmente progettato per essere in grado di eseguire uno script per lunghi periodi di tempo come si sta chiedendo. Per evitare potenziali perdite di memoria, arresti anomali, ecc., L'esecuzione continua dello script è un approccio migliore.

+0

Sembra fantastico, forse dovrei anche riscrivere il mio demone in questo modo. Saluti. –

+0

+1 Uso questo approccio. È semplice ed efficace – goat

0

Non andare troppo lontano con le macchine a stati, almeno è una buona idea introdurre stati sia per 'lavori' (esempio: conversione flv2avi) che per 'compiti' (flv2avi 1.flv).

Sul mio script (Perl), a volte i processi di zombi stanno iniziando a declassare le prestazioni dell'intero script. È un caso raro, ma è nativo in origine, quindi lo script dovrebbe essere in grado di interrompere la lettura della coda più, consentendo alla nuova istanza di continuare le sue attività &jobs; tuttavia, mantenendo i dati delle attività in esecuzione è il benvenuto. Una volta che la prima istanza ha 1-2 compiti, viene uccisa.

All'avvio: controllo per gli errori più comuni (a causa di arresto) controllo per gli errori noti (di spazio, non può leggere l'input) uccidere tutto ciò che può essere ucciso e impostare lo stato di 'attesa' avviare tutti in attesa .

Se si eseguono lavori con pipe (vlc | ffmpeg, tail -f | grep), si può provare ad evitare di usare troppo I/O nel proprio programma, invece di fare fork() (cattiva idea per PHP?) O semplicemente chiamando/bin/bash -c "prog1 | prog2", questo consente di risparmiare un sacco di carico della CPU.

punti di inizio: sia /etc/rc.d e cron (controllare i processi, eseguiti prima istanza || eseguito secondo con argomento 'debug')

1

Mentre PHP può accedere (pubblicare e consumare) MQ di, se non del tutto possibile provare a utilizzare un'applicazione MQ completamente funzionale per farlo.

Un'applicazione MQ completamente funzionale (in ruby, perl, .NET, java ecc.) Gestirà tutti i problemi di concorrenza, registrazione degli errori, gestione dello stato e scalabilità di cui si discute.

Problemi correlati