2010-04-07 16 views
6

Mam zaplanowane zadanie CRON do uruchamiania co 4 godziny, które musi zebrać informacje o kontach użytkowników. Teraz chcę przyspieszyć i podzielić pracę pomiędzy kilka procesów i użyć jednego procesu do aktualizacji bazy danych MySQL z pobranymi danymi z innych procesów.Pula wątków PHP?

W języku JAVA wiem, że istnieje puli wątków, które mogę poświęcić niektóre wątki, aby wykonać niektóre prace.

Jak to zrobić w PHP?

Wszelkie porady są mile widziane.

Thank

+0

Co robi zadanie cron? Skrypt powłoki i/lub skrypt PHP i/lub żądanie strony do serwera, który uruchamia skrypt php? – zaf

+0

Skrypt PHP, który używa biblioteki curl do analizowania danych kont użytkowników. – embedded

Odpowiedz

1

Jak mówili inni, procesy rozwidlone jest łatwiejsze niż tarła wątki z PHP. Ale dlaczego myślisz, że posiadanie jednego dedykowanego wątku do zapisania wyników z powrotem do bazy danych jest dobrym pomysłem? Chociaż jest to nieco łatwiejsze w przypadku wątków, a nie procesów, to nadal jest skomplikowanym narzutem, który nie wydaje się dodawać żadnej wartości do ogólnego celu.

Rzeczywiście, znacznie łatwiej jest uruchomić kilka instancji skryptu (z pewnym parametrem do partycjonowania danych) z crona, zamiast inicjować fork z kodu PHP - i nie zawracać sobie głowy jakimkolwiek wąskim gardłem do rejestrowania danych z powrotem do bazy danych.

C.

+0

To dobra opcja, która IMO jest znacznie lepsza niż procesy rozwidlania. Czy masz pojęcie, jak podzielić dane i ile instancji powinienem uruchomić, aby nie obciążać systemu? Mam na myśli 3 wystąpienia. – embedded

+0

Tak wiele instancji, ile chcesz. Jeśli dane są identyfikowane przez numer porządkowy lub inny numeryczny, użyj MOD, aby uzyskać każdy N-ty przypadek, np. SELECT * FROM mytable WHERE MOD (id, $ number_of_instances) = $ this_instance_id '(pamiętaj, aby uruchomić instancję 0) – symcbean

+0

dziękuję Przyjrzę się opcji MOD. – embedded

0

Czeskie tych stanowisk - * http://www.alternateinterior.com/2007/05/multi-threading-strategies-in-php.html * http://www.electrictoolbox.com/article/php/process-forking/

Zasadniczo musisz udostępniać dane między procesami i jak widzę, prawdopodobnie będziesz musiał napisać do jakiegoś pliku pierwszy. Pobierz przy użyciu głównego procesu (uczyń go procesem typu ajax-polling) i napisz do DB.

+0

co masz na myśli przez proces typowania ajax-poll? Myślę, że podążę ścieżką i rozwinąłem kilka procesów, aby wykonać zadanie i dołączyć wynik do pliku. Główny proces pobierze wszystkie dostępne w danym momencie rekordy, wyczyści plik i , a następnie zwolni blokadę i przetworzy je. Będę używał blokady na dedykowanym pliku, aby uniemożliwić dostęp Mulpile do pliku. Co sądzisz o tym zachowaniu? – embedded

+0

To zachowanie jest dokładnie tym, co przychodzi mi do głowy. w twoim przypadku, ponieważ jest to zadanie cron, będzie ono działać w określonych odstępach czasu i zbierać dane z pliku, a następnie zapisywać do DB. Ankieta Ajax będzie dotyczyła serwera WWW, w którym używasz javascript do tworzenia żądań ajaxowych zamiast zadania cron. – pinaki

+0

Myślę, że zaimplementuję to i wykorzystam, gdy zobaczę, że wykonanie mojej cron zajmuje więcej niż 4 godziny. Jeśli chodzi o hosting, muszę się upewnić, że biblioteka pcntl jest włączona? – embedded

0

Można widelec nowych procesów w PHP też: pcntl_fork()

BTW. czy ten skrypt działa dłużej niż 4 godziny? W przeciwnym razie nie widzę powodu, dla którego komplikuje to zarządzanie wątkami lub procesami.

+0

Można to zmienić dynamicznie. zależy to od liczby użytkowników korzystających z mojej usługi. Użyję tego mechanizmu TYLKO, gdy wykonanie skryptu będzie dłuższe niż 4 godziny. – embedded

2

PHP i wątki (te 2 słowa) nie mogą być połączone w tym samym zdaniu. PHP nie oferuje obsługi wątków. Możesz wypróbować mechanizmy rozwidlenia PCL lub przetwarzanie asynchroniczne, które w twoim przypadku nie jest pomocne.

Możesz użyć mechanizmu dystrybucji obciążenia, który może być tym, czego potrzebujesz, patrząc na Gearmana (sugeruj, że google to).

Zgodnie z opisem przez innych "jest to rozproszona maszyna rozwidlająca", która może zaoferować dystrybucję obciążenia, której szukasz, aby "przyspieszyć działanie".

pozdrowienia,

+0

Zajrzę w tym. Czy dostawcy usług hostingowych obsługują ten zestaw? – embedded

+0

To tylko lib, który instalujesz - serwer i klient - uruchamiasz demona i jesteś gotowy, aby zaakceptować prośby o przetwarzanie (wysoce zalecane do dystrybucji obciążenia) - http://gearman.org/ - sprawdź prezentacje również – Andreas

+0

I myślę, że to jest sposób na moje potrzeby. Zaimplementuję własny mechanizm. Dzięki – embedded

Powiązane problemy