Ta strona używa ciasteczek (cookies), dzięki którym nasz serwis może działać lepiej. Dowiedz się więcej OK, rozumiem

PHP multitasking

Zdecydowałeś się na tworzenie interaktywnych stron przy pomocy PHP? Chcesz w łatwy i szybki sposób zarządzać danymi na swojej stronie? Tutaj znajdziesz pomoc w napotkanych przy tym trudnościach.

PHP multitasking

Post 05.07.2017, 12:48:18

Jak rozwiązać sprawę wielozadaniowości w PHP.
Chciałbym jednocześnie skanować wiele adresów IP.
Znalazłem taki artykuł ale jakoś tego nie ogarniam.
https://www.mullie.eu/parallel-processing-multi-tasking-php/
sasiadstar
Posty: 123
Dołączył(a): 26.08.2016

Re: PHP multitasking

Post 05.07.2017, 13:34:36

mały przykład o co mi chodzi
Kod: Zaznacz cały
$wynik=array();
for($a=$początekIP;$a<=$koniecIP;$a=$a+5)//np
{
$wynik[0]=get_headers(...$a);
$wynik[1]=get_headers(...$a+1);
$wynik[2]=get_headers(...$a+2);
$wynik[3]=get_headers(...$a+3);
$wynik[4]=get_headers(...$a+4);
//uruchomić wiele sprawdzań i jeżeli się wykonają zwrócić wynik
return $wynik



}
sasiadstar
Posty: 123
Dołączył(a): 26.08.2016

Re: PHP multitasking

Post 05.07.2017, 15:45:05

Musisz to sobie doinstalować. PHP jest jednowątkowy, a to jest rozszerzenie.
kabexxx
Posty: 195
Dołączył(a): 27.11.2011

Re: PHP multitasking

Post 05.07.2017, 17:20:03

Ale co i jak tego uzyc
sasiadstar
Posty: 123
Dołączył(a): 26.08.2016

Re: PHP multitasking

Post 05.07.2017, 20:56:06

sasiadstar napisał(a):Ale co i jak tego uzyc

pthreads. Nie wiem co więcej na ten temat powiedzieć. Pod linkiem, który podałeś masz gotowy przykład. Tworzysz klasę dziedziczącą z klasy Thread. Implementujesz metodę run, w której wykonujesz robotę, którą chcesz wykonać (zgaduję, że chodzi o wywołanie get_headers.
Potem w pętli uruchamiasz wszystkie wątki i w osobnej pętli czekasz na ich zakończenie (wywołanie join()).
Jak w przykładzie podano, wynik pracy możesz przypisać jako własność do instancji Twojej klasy.

Pseudokod (pisane z palca):
Kod: Zaznacz cały
class CheckIpThread extends Thread {
    private $ip;
    public $data = null;

    public function __construct ($ip_to_check) {
        $this->ip = $ip_to_check;
    }

    public function run () {
        // tutaj wykonujesz zadanie
        $this->data = get_headers($this->ip);
    }
}

$threads = [];

for($a=$początekIP;$a<=$koniecIP;$a=$a+5) {
    $thread = new CheckIpThread($tutaj_przekazujesz_url_do_sprawdzenia);
    $threads []= $thread;
    $thread->start();   
}

foreach ($threads as $thread) {
    $thread->join(); // tutaj czekamy na zakończenie każdego wątku
}

foreach ($threads as $thread) { // wszystkie wątki skończyły robotę, więc możemy czytać wyniki ich pracy
    var_dump($thread->data);
}


Ale jak już poprzednik wspomniał, żeby móc z tego korzystać, Twoje PHP musi mieć zainstalowane i włączone to rozszerzenie.
Avatar użytkownikakuku
Rafał Kukawski

+∞
+∞

Posty: 19641
Dołączył(a): 14.04.2002

Re: PHP multitasking

Post 05.07.2017, 21:24:40

Dzięki Kuku jak zwykle jesteś nie zastąpiony.
Powiem szczerze że jeszcze tematu klas nie ogarnąłem i jeszcze ich nie używałem.
Ale myślę że po tym przykładzie (a bardziej gotowcu) jakoś sobie z tym tematem poradzę.
O doinstalowaniu poszukam i poczytam co i jak.
jeszcze jedno pytanie, czy dobrze myślę
Kod: Zaznacz cały
for($a=$początekIP;$a<=$koniecIP;$a=$a+5) {//tu wlasciwie powinno byc $a++
    $thread = new CheckIpThread($tutaj_przekazujesz_url_do_sprawdzenia);
    $threads []= $thread;
    $thread->start();   
}


rozumiem że po każdym przejściu pętli zostanie wywołana nowa instancja CheckIpThread i sprawdzony Ip.
tak się zastanawiam czysto teoretycznie ile w ciągu sekundy tych adresów przetworzonych dziesiątki setki czy może więcej
sasiadstar
Posty: 123
Dołączył(a): 26.08.2016

Re: PHP multitasking

Post 05.07.2017, 21:49:35

Na pewno będzie narzucony limit przez system operacyjny na ilość wątków na proces. Możliwe, że samo rozszerzenie też może mieć własny limit zdefiniowany w konfiguracji. Więc na pewno nie jest tak, że możesz ślepo uruchamiać dowolną ilość wątków. Poza tym, duża ilość wątków na raz nie musi koniecznie gwarantować widocznego zysku czasowego. W każdym razie najlepiej jak zrobisz sobie benchmark różnych kombinacji i wybierzesz strategię, która wyjdzie Ci najbardziej optymalnie. Pewną abstrakcją, która pozwoli fajnie zarządać wątkami/workerami, jest Pool. Możesz sobie poeksperymentować jaka wielkość puli wątków daje najlepsze efekty.
Avatar użytkownikakuku
Rafał Kukawski

+∞
+∞

Posty: 19641
Dołączył(a): 14.04.2002

Re: PHP multitasking

Post 06.07.2017, 07:00:24

Oj oj oj, toż to czarna magia poziom Expert :).
To jeszcze nie ten etap w moim życiu, na razie muszę odkryć sens klas bo do tej pory nie rozumiem poco one właściwie są , jak na razie obywałem się bez nich i jakoś dało się, no ale skoro są to znaczy że pełnią jakąś znaczącą role ale to raczej miejsce na inny post.
sasiadstar
Posty: 123
Dołączył(a): 26.08.2016

Re: PHP multitasking

Post 06.07.2017, 07:24:13

Sprawa jest taka, że można pisać programy obiektowo, a można też inaczej. Wiele zależy od języka programowania. Java stoi w zasadzie w całości na obiektówce, język C zaś nie, a PHP ma elementy obiektówki, ale nie są one wymagane (zresztą widzisz jak do tej pory żyłeś bez tego), sporo elementów standardowej biblioteki bazuje po prostu na funkcjach. Akurat rozszerzenie pthreads korzysta z obiektowego API, więc jeśli chcesz tego używać, bo zależy Ci na wielowątkowym wykonaniu Twojej aplikacji, to zignoruj na razie teorię, tylko po prostu utwórz klasę, która dziedziczy z Thread, a do metody run wpakuj całą logikę, którą chcesz wykonać w wątku.
Avatar użytkownikakuku
Rafał Kukawski

+∞
+∞

Posty: 19641
Dołączył(a): 14.04.2002

Re: PHP multitasking

Post 06.07.2017, 18:04:35

Tak tez uczynię, jakoś praktyka zawsze mi lepiej wychodziła niż teoria, a z czasem człowiek się z tymi "ficzerami" oswaja i nawet jak nie jest sobie tego w stanie opisać why its work to i tak z tego korzysta bo staje się to jakieś takie "normalne".
Pozdrawiam KUKU.
sasiadstar
Posty: 123
Dołączył(a): 26.08.2016

Re: PHP multitasking

Post 06.07.2017, 18:45:46

To rozszerzenie na pewno ułatwi ci teorię z wątkami i obiektówkę również.
Choćby z tego powodu, że ramowa praca z wątkami jest taka sama niezależnie od języka i platformy, no i programowanie obiektowe również wygląda wszędzie z grubsza tak samo.

Sam wątek pięknie pokazuje jak fajnie wygląda programowanie obiektowe - tak a tak obsługujesz powstawanie wątku, tak i tak wykonanie jego logiki, a w inny sposób łączenie ich. To jest właśnie podstawa zrozumienia działania wątków.
Do tego obsługa wbudowanych właściwości i tworzenie własnych pomocniczych. I już pewną praktykę z tym masz.
kabexxx
Posty: 195
Dołączył(a): 27.11.2011

Re: PHP multitasking

Post 10.07.2017, 09:26:06

Wrócę do tematu bo znowu napotkałem problem.
Po paru próbach i kombinacjach nie udało mi się tego dodatku zainstalować w PHP7.
W 5.6 uruchomiłem i działa.
Autor napisał że popełnił największy błąd w życiu i od teraz można to uruchamiać tylko w CLI.
I własnie ni pierona nie wiem co to takiego.
Robiłem według jakiegoś poradnika i było tam napisane żeby skopiować php.ini i zmienić nazwę na php-cli.ini
i tam dać extension=php_pthreads.dll no ale jakoś nie chce działać.
sasiadstar
Posty: 123
Dołączył(a): 26.08.2016

Re: PHP multitasking

Post 26.07.2017, 03:58:50

CLI = CommandLine Interface

Czyli tak, jako moduł serwera nie pójdzie.
Ciekawe, jaki błąd popełnił...
kabexxx
Posty: 195
Dołączył(a): 27.11.2011

Re: PHP multitasking

Post 26.07.2017, 20:51:19

https://github.com/pda/pheanstalk
mozesz to wykorzystać. Najpierw wrzucasz w tube swoje joby. potem w screenie odpalasz kilka okien i w kazdym skrypt nasluchujący czy masz coś w kolejce, no i obrabiasz jak tam chcesz.
borabora
Posty: 21
Dołączył(a): 12.09.2014

Re: PHP multitasking

Post 08.08.2017, 13:21:31

Próbowałem tego rozwiaznia i działać działa ale nie do końca bo czasami zwraca ze adres url nie działa mimo ze url na pewno jest Ok.
Tak się zastanawiam jak to można rozwiązać za pomocą crona czyli wielokrotnie uruchamiać ten sam skrypt.
o ile wiem jak to zrobić to już kompletnie nie przychodzi mi do głowy jak pobierać dane przez taki skrypt żeby sprawdzanie się nie dublowało.
Chodzi mi o sprawdzanie zakresów ip
np 2.0.0.0-2.255.255.255
Pojedynczy wątek zajmie cale wieki.
sasiadstar
Posty: 123
Dołączył(a): 26.08.2016

Re: PHP multitasking

Post 09.08.2017, 12:19:15

jeśli chodzi o pheanstalka to najpierw wrzucasz w kolejkę te adresy. potem w skrypcie obrabiajacym:

Kod: Zaznacz cały
$queue = new Pheanstalk\Pheanstalk($host, $port);
$queue->watchOnly('Tutaj_nazwa_tuby_do_ktorej_wrzuciles');
while($job=$queue->reserve()) {
    $queue->delete($job);//wywali dany adres z kolejki
   //tu robisz co tam chcesz z danymi w $job
}
borabora
Posty: 21
Dołączył(a): 12.09.2014

Re: PHP multitasking

Post 14.08.2017, 08:53:29

Znalazłem przyczynę takiego zachowania wielowątkowości i okazało się że to nie tego wina tylko LTE po prostu gubiło pakiety i już, na kablu działa aż milo.
Teraz znowu utknołem bo nie rozumiem zachowania tego skryptu gdyż przerabia tylko 897-905 linków i koniec strona się kreci i nic więcej.
Wstawiłem do testów samo liczenie żeby zobaczyć w jakim miejscu się zatrzymuje, zmniejszałem ilość równoległych wykonań i za każdym razem 897-905 i skrypt się "wiesza" .
Dodałem unset($thread); i tez żadnego efektu przerabia 897-905 wątków i koniec.
sasiadstar
Posty: 123
Dołączył(a): 26.08.2016

Re: PHP multitasking

Post 14.08.2017, 09:17:50

Znalazłem w dokumentacji ze można to zabić var_dump($thread->kill());
Powinno zwrócić true a u mnie jest false?
sasiadstar
Posty: 123
Dołączył(a): 26.08.2016

Re: PHP multitasking

Post 19.08.2017, 13:12:38

Po tygodniu poszukiwań znalazłem rozwiązanie wszelkich problemów.
Wystarczy zrobić tak
Kod: Zaznacz cały
//.....
for($a=0;$a<=200000;$a=$a+100)// wartośc wykonywana w krokach co 100 wątków
{$zm[]=th_($a);//ma być $moje_ip[$a]
 
echo_($zm);//tymczasowo do testowania
unset($zm);//tu tez nic z tego
sleep(1);/////////////////////Dodajemy sleep i po sprawie.
}
 
function th_($co)
{$threads = [];
    for($a=0;$a<=100;$a++)
    {
 
$thread = new CheckIpThread($co+$a);
//.....
sasiadstar
Posty: 123
Dołączył(a): 26.08.2016


Powrót do PHP i bazy danych


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 4 gości

Hosting, Domeny, SSL

Subskrypcja

Mamy 50674 zarejestrowanych użytkowników.
Najnowszy użytkownik: Corneliu


Nasi użytkownicy napisali:

  • 936061 wiadomości
  • w 246711 tematach

Najnowsze wpisy na blogu

Najnowsze artykuły

Najaktywniejsi (ostatnie 30 dni)