2012-04-26 22 views
9

Jestem w punkcie mojego API PHP po stronie serwera, gdzie robię dużo zapytań MySQL i chciałbym go przyspieszyć poprzez zmultiplikowanie wątków pracujących nad różnymi zapytaniami, a następnie zwrócenie wyników.Współbieżność w PHP

Ale jak utworzyć kolejny wątek w PHP? Mijam parametry POST, więc prosty shell_exec() może działać, ale wydaje się trochę niebezpieczny. Opcje Zastanawiam:

1) Dokonaj cURL żądanie przy użyciu parametrów mam, proces JSON z żądania, a następnie powrót

2) wezwać shell_exec() z PHP CLI i jakoś (jak mogłoby zrobić to?) przetwarzanie odpowiedzi w PHP

jakie są najlepsze opcje tutaj?

+0

Zwykle odbywa się to z kolejki i pracownika, który monitoruje go – zerkms

+0

jak to zrobić? – lollercoaster

+0

skonfigurowałeś oprogramowanie do zarządzania kolejkami (np. Rabbitmq). Następnie skrypt dodaje zadanie do kolejki i jakiś pracownik działający w tle wykonuje go. – zerkms

Odpowiedz

4

Nie ma obsługi wątków w PHP. Możesz jednak użyć rozszerzenia pcntl, aby spawnować i zarządzać widłami, ale najlepiej byłoby, gdybyś spojrzał na algorytmy po raz drugi, gdybyś doszedł do wniosku, że należy robić rzeczy z wątkami.

Opcja asynchronicznego przetwarzania długotrwałych operacji polega na przechowywaniu ich w bazie danych, a procesowi obsługi w tle pobieranie ich z bazy danych, obliczanie wyników, a następnie zapisywanie wyników w bazie danych. Następnie skrypt skierowany do przodu będzie szukał ich w bazie danych, aby zobaczyć, czy są one zakończone i jaki jest wynik.

+1

jak w przypadku PHP budowane są w dużej skali strony internetowe, jeśli tak jest? – lollercoaster

+1

@lollercoaster: jak "duża skala" jest związana z wątkami? – zerkms

+1

wydaje mi się, że krytyczne dla wydajności interfejsy API/witryny z wieloma interakcjami z bazami danych będą wymagały współbieżności – lollercoaster

3

Zapoznaj się z pcntl extension. PHP w ogóle nie obsługuje prawdziwych wątków, więc musisz zaimplementować pseudo-wątki za pomocą fork() ing. Zauważ, że fork() procesu jest znacznie "cięższy" niż tworzenie wątku.

2

PHP nie zaimplementował wątków (i prawdopodobnie nigdy nie będzie), ponieważ wiele bibliotek PHP NIE jest bezpiecznych dla wątków. Ta alternatywa to pcntl, która otacza funkcję C fork.

Mam created a handy wrapper dla tych funkcji, które pozwalają mi zarządzać nimi na wyższym poziomie.

$thread1 = new Thread(function($thread) { 
    sleep(4); 
    $thread->write("Hello\n"); 
}); 

$thread2 = new Thread(function($thread) { 
    sleep(5); 
    $thread->write("World\n"); 
}); 

$thread3 = new Thread(function($thread) { 
    sleep(6); 
}); 

print $thread1->read(); // time: 0 -> 4 
print $thread2->read(); // time: 4 -> 5 
$thread3->join(); // time 5 -> 6 

// More advanced handling: 
// Thread::selectUntilJoin(array($thread1, $thread2, $thread3), function() { ... }, function() { ... }); 
+0

"co oznacza, że ​​funkcje nie mogą być wywoływane z różnych wątków" --- nie jest to poprawna definicja dla kodu TS – zerkms

Powiązane problemy