2010-09-21 7 views
5

Zobacz także Having a PHP script loop forever doing computing jobs from a queue system, ale to nie odpowiada na wszystkie moje pytania.Czy skrypt PHP działa wiecznie, dostęp do kolejki

Jeśli chcę uruchomić skrypt PHP wiecznie dostępu kolejkę i robi pracy:

  1. Jaki jest potencjał do problemów z pamięcią? Jak ich uniknąć? (jakiekolwiek funkcje spłukiwania lub coś, czego powinienem użyć?)

  2. Co, jeśli skrypt zginie z jakiegoś powodu? Jaka byłaby dobra metoda automatycznego ponownego uruchomienia?

  3. Jakie byłoby najlepsze podstawowe podejście do uruchomienia skryptu. Ponieważ działa wiecznie, nie potrzebuję crona. Ale jak mogę go uruchomić? (Zobacz także 2.)

+0

1. Zależy od tego, co robisz. Niektóre rozszerzenia mają poważne wycieki pamięci. - 2. Użyj jakiejś osłony. - 3. Rozwidlenie() w tle. – halfdan

+0

Co dokładnie będzie robić wiecznie? Jak to * zawsze * będzie mieć pracę do wykonania? Kiedy to drenuje kolejkę, co wtedy robi? I dlaczego PHP? – Dolph

Odpowiedz

9

Ustaw kolejkę jako skrypt cron. Zrób to co 10 sekund. Po uruchomieniu skryptu sprawdź, czy istnieje plik blokady (coś w stylu .lock). Jeśli tak, natychmiast wyjdź. Jeśli nie, utwórz blokadę i rozpocznij przetwarzanie. Jeśli wystąpią jakiekolwiek błędy, wyślij e-mail/zapisz te błędy, usuń blokadę i zakończ. Jeśli nie ma zadań, zakończ.

Myślę, że to podejście jest idealne, ponieważ PHP nie jest tak naprawdę zaprojektowane, aby móc uruchamiać skrypt przez dłuższy czas, tak jak pytasz. Aby uniknąć potencjalnych wycieków pamięci, awarii itp., Ciągłe wykonywanie skryptu jest lepszym rozwiązaniem.

+0

Brzmi świetnie, może powinienem również przepisać mojego demona w ten sposób. Twoje zdrowie. –

+0

+1 Używam tego podejścia. To proste i skuteczne. – goat

0

Nie posuwając się zbyt daleko w maszynach państwowych, przynajmniej warto wprowadzić stany zarówno do "zadań" (przykład: konwersja flv2avi) i "zadań" (flv2avi 1.flv).

W moim skrypcie (Perl), czasami procesy zombie zaczynają obniżać wydajność całego skryptu. Jest to rzadki przypadek, ale jest natywny w źródle, więc skrypt powinien już być w stanie przerwać czytanie kolejki, pozwalając nowej instancji na kontynuowanie jej zadań &jobs;, jednak zachowywanie jak największej liczby danych uruchomionych zadań jest mile widziane. Gdy pierwsza instancja ma 1-2 zadania, zostaje zabita.

Na początek: czek na typowych błędów (ze względu na zamykanie) odprawy dla znanych błędów (z miejsca, nie może odczytać wejściowe) zabić cokolwiek może być zabity i ustawić status „oczekiwanie” zacząć wszystko czeka .

Jeśli uruchamiasz zadania potokowe (vlc | ffmpeg, tail -f | grep), możesz spróbować uniknąć użycia zbyt wielu operacji we/wy w swoim programie, zamiast robić fork() (zły pomysł na PHP?) Lub po prostu wywołanie/bin/bash -c "prog1 | prog2", to oszczędza dużo obciążenia procesora.

punkty startu: zarówno /etc/rc.d i cron (sprawdzić procesy, które są prowadzone pierwsze wystąpienie || uruchomić drugi z 'debug' argument)

1

Chociaż PHP można uzyskać dostępu (publikować i konsumować) MQ, o ile w w tym celu należy spróbować użyć w pełni funkcjonalnej aplikacji MQ.

W pełni funkcjonalna aplikacja MQ (w Ruby, Perl, .NET, Java itp.) Poradzi sobie z wszystkimi problemami współbieżności, rejestrowania błędów, zarządzania stanami i skalowalności, które omawiasz.

Powiązane problemy