Współbieżność w PHP

11

Click here to load reader

Transcript of Współbieżność w PHP

Page 1: Współbieżność w PHP

Współbieżność

Jakub Nietrzeba

Page 2: Współbieżność w PHP

TAK● Dużo łatwych do wydzielenia odrębnych zadań

– Obliczenia

– Pobieranie plików, dręczenie SOAPa

● Potężny serwer, dużo RAMu● Lepsze zagospodarowanie sprzętu i łącza

NIE● Operacje na bazach danych● Operacje na dysku● Serwery oparte o gniazdka (select!)● Może biblioteka zewnętrzna już to ma? (np. GraphicsMagick do

zdjęć)● Koszty utrzymania rosną!

Page 3: Współbieżność w PHP

Komunikacja z wątkiem

● Kolejki komunikatów (msg_get_queue, msg_receive)– Ograniczenia rozmiaru! (do obejścia)

– Autoserializacja (uwaga na klasy!)

– Protip: ftok używa tylko jednego znaku!

● Dzielona pamięć (shmop_open, shmop_read)– „Prawie” plik, bardziej zmienna

– Trzeba synchronizować zapis/odczyt

– Dane muszą mieścić się w pamięci

Page 4: Współbieżność w PHP

Komunikacja z wątkiem

● Potoki nazwane (posix_mkfifo)– Zachowują się jak pliki (fread, fwrite)

– Warto używać selecta (stream_select)

– Rozmiar bufora 65KB (1 MB max!)

● Sygnały● Semafory, mutexy

Page 5: Współbieżność w PHP

Sposoby

● pthreads● pcntl_fork● proc_open/popen● inne (magia!)

Page 6: Współbieżność w PHP

pthreads

● „Prawdziwe” wątki● Pełna gama gotowych klas (Wątki, Workery, Pool…)● Uruchamiane na żądanie, można usypiać, wznawiać● Wymagają rekompilacji PHP● Synchronizacja! Serializacja!● Nie wszystko działa jak powinno

– Kopiowanie uchwytów do zasobów rodzi bugi

– Classloader zanika

Page 7: Współbieżność w PHP

pthreads

<?phpclass Watek extends Thread { public function run() { // działamy działamy }}

$w = new Watek();$w->z = 123;$w->start();

Page 8: Współbieżność w PHP

pcntl_fork

● Najstarszy mechanizm wątków● Działa wszędzie (czyli nie na Windowsie)● Łatwe w uruchomieniu, trudne w synchronizacji● Robi się trudno gdy chcemy mieć więcej dzieci● Wątek od razu się uruchamia● Komunikacja z wątkiem jest na naszej głowie● Kopiowanie zasobów!● Łase na pamięć

Page 9: Współbieżność w PHP

pcntl_fork

<?php

$pid = pcntl_fork();

if($pid < 0) die('Uuuups');if($pid) {

//tu wpadnie w wątku rodzicapcntl_wait($status); //czekamy aż dziecko skończy

} else {//tu się toczy wątek dziecka, działamy!

}

Page 10: Współbieżność w PHP

proc_open

● „Prawie” to samo co fork● Uruchamia się nowy proces● Uniwersalne● Łase na pamięć● Bardzo przydatne strumienie wejścia/wyjścia● Skomplikowane uruchamianie i zarządzanie● Nice! (proc_nice)

Page 11: Współbieżność w PHP

Magia!

● curl_multi_init● win32service● Demonizacja