2010-05-16 7 views
5

To jest podchwytliwe pytanie, podczas rozwijania aplikacji php + ajax i poczułem kilka długich pytań, nic złego w nich, ale mogą one być wykonane w tle.Jak przepłukać dane w php i rozłączyć użytkownika, ale zachować przy życiu skrypt

Wiem, że istnieje sposób na wysłanie odpowiedzi do użytkownika podczas rzucania prawdziwego przetwarzania do innego procesu przez exec(), jednak nie wydaje mi się to właściwe, może to generować exploity i nie jest to praktyczne jest kompatybilny z wirtualnymi serwerami i platformą.

PHP oferuje funkcje ob_ *, chociaż pomagają w opróżnianiu pamięci podręcznej, ale użytkownik będzie utrzymywał połączenie dopóki skrypt nie zostanie uruchomiony.

Zastanawiam się, czy istnieje alternate do exec, aby skrypt działał po wysłaniu danych do użytkownika i zamknięciu połączenia/wątku z apache, lub mniej "brudnym" sposobem przesyłania danych przetwarzania do innego skryptu.

+0

„to jest podchwytliwe pytanie?” –

+0

Naprawdę dobre pytanie, szukałem tego, dziękuję. – PolishHurricane

Odpowiedz

1

Po robi rozeznanie mam Znaleziono 3 odpowiedzi na to pytanie:

  1. zrobić ajax prośbę o niskiej wartości limitu czasu, po osiągnięciu limitu czasu JS przejdzie do następnego kroku while php, w tle z włączoną ignore_user_abort, będzie kontynuować przetwarzanie.

  2. Rozłącz powolne procesy ze skryptu, który bezpośrednio odpowiada użytkownikowi, wykonując natychmiastową odpowiedź lub częściową odpowiedź (jeśli to możliwe, w zależności od przypadku), przechowując wolne zmienne procesowe w _SESSION lub w bazie danych, wysyłając je do pracownika przez cURL z niską wartością limitu czasu LUB z zadaniem cron do wywoływania pracowników.

  3. Użyj urządzenia Gearman.

2

To, czego używam na moich stronach internetowych to Gearman.

Gearman pozwala uruchamiać pracowników zadań w tle za pomocą wiersza poleceń. Ci pracownicy nasłuchują żądań dotyczących określonych zadań, a następnie przetwarzają je, gdy otrzymają żądanie.

Po stronie aplikacji WWW, po prostu robię $GEARMAN->doBackground("task_name","task_data");, a następnie zadanie jest wysyłane do pracownika, a wykonanie natychmiast powraca do skryptu.

Jest to znacznie bezpieczniejsze niż wykonanie exec, ponieważ zadanie przekładni działa jako funkcja PHP.

+1

To wspaniale, to naprawdę ułatwia wprowadzanie zabezpieczeń – Rodrigo

0

PHP ma do tego funkcję o nazwie ignore_user_abort.

Można również przechowywać w bazie danych kolejkę zadań do wykonania, a zadanie cron należy okresowo sprawdzać w poszukiwaniu nowych zadań i przetwarzać je po ich otrzymaniu.

0

Mam klasę PHP, która jest demonem POSIX. Zacznę go i zasadniczo skrypt ma

while(1) 
{ 
// run task 
} 

można umieścić połączeń baz danych i wszystko w pętli - reaguje na sygnały POSIX zbyt - I zazwyczaj ustawić go spać przez 120 sekund, a następnie uruchom ponownie. Używam tego razem z małym stołem, który jest moją kolejką. Zamiast używać śmiercionośnego exec() mogę użyć bezpieczniej przygotowanego wyciągu, aby wstawić identyfikator do mojej tabeli kolejki, który skrypt w tle zostanie przechwycony w ciągu następnych 30 sekund.

uwaga - zabijam demona i restartuję go co 3 godziny, ponieważ czasami się utknie i nie przetwarza więcej - ale zwykłe zabijanie i uruchamianie co 3 godziny jest dobrym kompromisem w uzyskiwaniu kolejek na żywo z uruchomieniem

edit nie chcę, aby umieścić cały skrypt, ale mogę jeśli ktoś chce to

Powiązane problemy