Współbieżność w PHP
Click here to load reader
-
Upload
jakub-nietrzeba -
Category
Technology
-
view
220 -
download
0
Transcript of Współbieżność w PHP
![Page 1: Współbieżność w PHP](https://reader038.fdocuments.pl/reader038/viewer/2022100800/58ef278d1a28abe9108b4635/html5/thumbnails/1.jpg)
Współbieżność
Jakub Nietrzeba
![Page 2: Współbieżność w PHP](https://reader038.fdocuments.pl/reader038/viewer/2022100800/58ef278d1a28abe9108b4635/html5/thumbnails/2.jpg)
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](https://reader038.fdocuments.pl/reader038/viewer/2022100800/58ef278d1a28abe9108b4635/html5/thumbnails/3.jpg)
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](https://reader038.fdocuments.pl/reader038/viewer/2022100800/58ef278d1a28abe9108b4635/html5/thumbnails/4.jpg)
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](https://reader038.fdocuments.pl/reader038/viewer/2022100800/58ef278d1a28abe9108b4635/html5/thumbnails/5.jpg)
Sposoby
● pthreads● pcntl_fork● proc_open/popen● inne (magia!)
![Page 6: Współbieżność w PHP](https://reader038.fdocuments.pl/reader038/viewer/2022100800/58ef278d1a28abe9108b4635/html5/thumbnails/6.jpg)
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](https://reader038.fdocuments.pl/reader038/viewer/2022100800/58ef278d1a28abe9108b4635/html5/thumbnails/7.jpg)
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](https://reader038.fdocuments.pl/reader038/viewer/2022100800/58ef278d1a28abe9108b4635/html5/thumbnails/8.jpg)
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](https://reader038.fdocuments.pl/reader038/viewer/2022100800/58ef278d1a28abe9108b4635/html5/thumbnails/9.jpg)
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](https://reader038.fdocuments.pl/reader038/viewer/2022100800/58ef278d1a28abe9108b4635/html5/thumbnails/10.jpg)
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](https://reader038.fdocuments.pl/reader038/viewer/2022100800/58ef278d1a28abe9108b4635/html5/thumbnails/11.jpg)
Magia!
● curl_multi_init● win32service● Demonizacja