2009-04-04 7 views
8

Pracuję nad interfejsem sieciowym PHP, który otrzyma ogromny ruch. Niektóre żądania wstawiania/aktualizacji będą zawierać obrazy, które będą musiały zostać zmienione na niektóre typowe rozmiary, aby przyspieszyć ich dalsze pobieranie.Najlepszy sposób na odciążenie ciężkiego przetwarzania (jak zmiana rozmiaru obrazu) z żądania PHP

Jednym ze sposobów, aby to zrobić jest prawdopodobnie założyć jakąś asynchroniczne kolejki na serwerze. Na przykład. skonfiguruj tabelę w db z kolejką zadań, która będzie zapełniana przez żądania PHP i pozwól innym procesom na serwerze obserwować tabelę i przetwarzać wszelkie oczekujące zadania. Jak byś to zrobił? Jakie byłoby właściwe środowisko dla tego długotrwałego procesu? Java, a może zrobi coś lżejszego?

Odpowiedz

14

Jeśli to, co robisz jest naprawdę duża ilość to co szukasz jest coś takiego jak beanstalkd. Jest to rozproszony procesor kolejki pracy. Po prostu umieszczasz pracę w kolejce, a potem o niej zapominasz.

Oczywiście potem trzeba coś na drugim końcu czytanie kolejkę i przetwarzania pracy. Istnieje wiele sposobów na zrobienie tego.

Najłatwiej jest prawdopodobnie mieć crona, który działa wystarczająco często, aby przeczytać kolejkę pracy i przetwarzać żądania. Alternatywnie możesz użyć pewnego rodzaju trwałego procesu demona, który jest budzony, gdy praca staje się dostępna.

Zaletą tego rodzaju podejścia jest to, że można dostosować liczbę pracowników do ilości pracy, jaką trzeba wykonać, a beanstalkd obsługuje rozproszony proces obsługi (w tym sensie, że uczestnicy mogą znajdować się na różnych maszynach).

+1

Niedawno zaimplementowałem procesor kolejki Beanstalkd/PHP, i jako część tego, obraz resizer. 2 tygodnie i 950 tys. Zadań później (z 3600 zmianami rozmiaru), zazwyczaj kończy się zmiana rozmiaru w krótszym czasie niż powrót do strony. –

2

Możesz ustawić zadanie cron, które sprawdzi tabelę kolejki. Skrypt obsługujący akcje oczekujące w kolejce można zapisać np. w php, więc nie musisz zmieniać języka implementacji.

2

co chcesz stworzyć demona, który będzie „uśpienia” na pewien okres czasu, a następnie sprawdzić bazę danych dla elementów do przetworzenia. Po znalezieniu przedmiotów do przetworzenia, przetwarza je, a następnie sprawdza ponownie, gdy tylko zostanie zrobione, jeśli nie, spać. Możesz tworzyć demony w dowolnym języku, w tym w PHP.

Alternatywnie, możesz po prostu kazać PHP wykonać skrypt i kontynuować. Aby PHP nie czekało na zakończenie działania skryptu, uruchom go w tle.

Mimo że należy zachować ostrożność, ponieważ może się zdarzyć, że zbyt wiele procesów będzie działać w tle, ponieważ nie ma potrzeby kolejkowania.

2

Używam Perla do długotrwałego procesu w połączeniu z beanstalkd. Zaletą jest to, że klient Beanstalkd dla Perla ma metodę rezerwy blokującej. W ten sposób nie zużywa prawie czasu procesora, gdy nie ma nic do zrobienia. Ale kiedy musi wykonać swoją pracę, automatycznie rozpocznie przetwarzanie. Bardzo wydajny.

+0

+1 Beanstalkd Robię to samo z witryną PHP i klientami beanstalk. 1,6 mln miejsc pracy do tej pory (w ciągu 14 dni) wykonałem pierwszy zestaw zadań, które mu zleciłem. –

+1

Czy istnieje klient beanstalkd, którego nie można zarezerwować? – Fluffy

1

Można skorzystać z usługi jak IronWorker zrobić przetwarzania obrazu w tle, a Zdejmij obciążenie serwerów. Ponieważ jest to usługa, nie musisz niczego zarządzać ani ustawiać czegokolwiek innego i będzie skalować się wraz z tobą w miarę rozwoju, więc jeśli zrobisz z nim jeden obraz, możesz skalować do milionów obrazów bez wysiłku.

Oto artykuł o tym, jak zrobić kilka przemian przetwarzania obrazu:

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

przykłady istnieją w Ruby, ale można robić te same rzeczy z PHP dość łatwo.

Powiązane problemy