2009-04-04 13 views
8

Sto lavorando su un'interfaccia web PHP che riceverà traffico enorme. Alcune richieste di inserimento/aggiornamento conterranno immagini che dovranno essere ridimensionate ad alcune dimensioni comuni per accelerare il loro ulteriore recupero.Il modo migliore per scaricare l'elaborazione pesante (come il ridimensionamento delle immagini) su richiesta PHP

Un modo per farlo è probabilmente impostare una coda asincrona sul server. Per esempio. impostare una tabella in un db con una coda di attività che verrà popolata da richieste PHP e lasciare che altri processi sul server guardino la tabella ed elaborino le attività di attesa. Come lo faresti? Quale sarebbe l'ambiente adatto per quel lungo processo in corso? Java, o forse qualcosa di più leggero farebbe?

risposta

14

Se quello che stai facendo è veramente alto volume, allora quello che stai cercando è qualcosa come beanstalkd. È un processore di coda di lavoro distribuito. Hai appena messo un lavoro in coda e poi ti sei dimenticato.

Ovviamente è necessario qualcosa all'altra estremità per leggere la coda e elaborare il lavoro. Ci sono molti modi per farlo.

Il più semplice è probabilmente avere un processo cron che viene eseguito abbastanza spesso per leggere la coda di lavoro ed elaborare le richieste. In alternativa puoi usare una sorta di processo demone persistente che viene riattivato dal lavoro che diventa disponibile.

Il vantaggio di questo tipo di approccio è che è possibile adattare il numero di lavoratori a quanto lavoro occorre fare e beanstalkd gestisce la distribuzione distribuita (nel senso che i listener possono essere su macchine diverse).

+1

Ho recentemente implementato un processore di coda Beanstalkd/PHP e, come parte di esso, un ridimensionatore di immagini. 2 settimane e 950 K lavori successivi (con 3600+ ridimensionamenti), di solito si sta completando il ridimensionamento in meno tempo di quanto necessario per restituire la pagina. –

2

È possibile impostare un'attività cron che controlli la tabella delle code. Lo script che gestisce le azioni in attesa in coda può essere scritto per es. in php quindi non devi cambiare la lingua di implementazione.

2

Si vorrebbe creare un daemon che "dorma" per un periodo di tempo e quindi controlla il database per gli elementi da elaborare. Una volta trovato gli elementi da elaborare, li avrebbe elaborati e quindi ricontrollati non appena fosse stato fatto, se non di più, poi dormivano. È possibile creare daemon in qualsiasi lingua, incluso PHP.

In alternativa, si può semplicemente avere PHP eseguire uno script e continuare. In modo che PHP non aspetti che lo script finisca prima di continuare, eseguirlo in background.

exec("nohup /usr/bin/php -f /path/to/script/script.php > /dev/null 2>&1 &"); 

Anche se bisogna stare attenti con che, poiché si potrebbe finire con l'avere troppi processi in esecuzione in background poiché non v'è nessuna coda.

2

Uso il Perl per il processo a esecuzione prolungata in combinazione con beanstalkd. La cosa bella è che il client Beanstalkd per Perl ha un metodo di riserva di blocco. In questo modo utilizza quasi nessun tempo di CPU quando non c'è niente da fare. Ma quando deve fare il suo lavoro, inizierà automaticamente l'elaborazione. Molto efficiente.

+0

+1 Beanstalkd Sto facendo lo stesso con un sito Web PHP e client beanstalk. 1,6 milioni di lavori pubblicati finora (in 14 giorni) per il primo set di attività che ho lanciato. –

+1

Esiste un client beanstalkd, che non può prenotare? – Fluffy

1

È possibile utilizzare un servizio come IronWorker per eseguire l'elaborazione delle immagini in background e scaricare i server. Dato che si tratta di un servizio, non dovrai gestire nulla o impostare altro e verrà scalato con te man mano che cresci, quindi se puoi fare un'immagine con esso, puoi scalare fino a milioni di immagini con zero sforzi.

Ecco un articolo su come fare un po 'di trasformazioni di elaborazione delle immagini:

http://dev.iron.io/solutions/image-processing/

Gli esempi ci sono in Ruby, ma si poteva fare le stesse cose con PHP piuttosto facilmente.

Problemi correlati