Czy istnieje realistyczny sposób implementacji modelu wielowątkowego w PHP, czy to naprawdę, czy tylko symulując go. Jakiś czas temu zasugerowano, że można zmusić system operacyjny do załadowania innej instancji pliku wykonywalnego PHP i obsługiwać inne jednoczesne procesy.
Problem polega na tym, że po zakończeniu wykonywania kodu PHP instancja PHP pozostaje w pamięci, ponieważ nie ma możliwości zabicia go z poziomu PHP. Więc jeśli symulujesz kilka wątków, możesz sobie wyobrazić, co się stanie. Wciąż szukam sposobu, w jaki wielowątkowość może być efektywnie wykonana lub symulowana z poziomu PHP. Jakieś pomysły?
php
multithreading
Steve Obbayi
źródło
źródło
Odpowiedzi:
Wielowątkowość jest możliwa w php
Tak, możesz robić wielowątkowość w PHP za pomocą pthreads
Z dokumentacji PHP :
Prosty test
Pierwszy bieg
Drugi bieg
Przykład świata rzeczywistego
źródło
dlaczego nie używasz popen ?
źródło
Wątek nie jest dostępny w magazynie PHP, ale możliwe jest równoczesne programowanie przy użyciu żądań HTTP jako wywołań asynchronicznych.
Po ustawieniu limitu czasu curl na 1 i użyciu tego samego session_id dla procesów, które chcesz ze sobą powiązać, możesz komunikować się ze zmiennymi sesji jak w moim przykładzie poniżej. Dzięki tej metodzie możesz nawet zamknąć przeglądarkę, a na serwerze nadal istnieje współbieżny proces.
Nie zapomnij zweryfikować poprawnego identyfikatora sesji w ten sposób:
startprocess.php
proces1.php
Veritsession.php
closeprocess.php
źródło
set_time_limit(0);
yikes! Nigdy, nigdy tego nie rób.Chociaż nie możesz wątkować, masz pewien stopień kontroli procesu w php. Dwa przydatne tutaj zestawy funkcji to:
Funkcje kontroli procesu http://www.php.net/manual/en/ref.pcntl.php
Funkcje POSIX http://www.php.net/manual/en/ref.posix.php
Możesz rozwidlić swój proces za pomocą pcntl_fork - zwracając PID dziecka. Następnie możesz użyć posix_kill, aby uzyskać ten PID.
To powiedziawszy, jeśli zabijesz proces nadrzędny, do procesu potomnego należy wysłać sygnał z informacją o śmierci. Jeśli sam php nie rozpoznaje tego, możesz zarejestrować funkcję do zarządzania nim i zrobić czyste wyjście używając pcntl_signal.
źródło
używanie wątków jest możliwe dzięki rozszerzeniu PECL pthreads
http://www.php.net/manual/en/book.pthreads.php
źródło
Wiem, że to stare pytanie, ale dla osób szukających istnieje rozszerzenie PECL napisane w C, które daje teraz możliwość wielowątkowości PHP, znajduje się tutaj https://github.com/krakjoe/pthreads
źródło
Możesz użyć exec () do uruchomienia skryptu wiersza poleceń (takiego jak php wiersza poleceń), a jeśli potokujesz wyjście do pliku, twój skrypt nie będzie czekał na zakończenie polecenia.
Nie do końca pamiętam składnię CLI CLP, ale chciałbyś czegoś takiego:
Myślę, że sporo współużytkowanych serwerów hostingowych ma domyślnie wyłączone exec () ze względów bezpieczeństwa, ale warto spróbować.
źródło
Możesz symulować wątki. PHP może uruchamiać procesy w tle za pośrednictwem popen (lub proc_open). Procesy te można komunikować za pomocą stdin i stdout. Oczywiście procesy te same mogą być programami php. Prawdopodobnie jest tak blisko, jak to tylko możliwe.
źródło
W zależności od tego, co próbujesz zrobić, możesz również użyć curl_multi, aby to osiągnąć.
źródło
Wiem, że to już dawno, ale możesz spojrzeć na http://phpthreadlib.sourceforge.net/
Obsługuje dwukierunkową komunikację między wątkami, a także ma wbudowane zabezpieczenia przed zabijaniem wątków potomnych (zapobieganie sierotom).
źródło
Możesz mieć opcję:
źródło
Klasa Temat jest dostępny od pthreads PECL ≥ 2.0.0.
źródło
Co powiesz na pcntl_fork?
sprawdź na naszej stronie podręcznika przykłady: PHP pcntl_fork
źródło
pcntl_fork
nie będzie działać w środowisku serwera WWW, jeśli ma włączony tryb awaryjny . W takim przypadku będzie działać tylko w wersji CLI PHP.źródło
Jeśli korzystasz z serwera Linux, możesz użyć
Jeśli potrzebujesz przekazać kilka argumentów
W script.php
Lub użyj Symfony https://symfony.com/doc/current/components/process.html
źródło
W chwili pisania mojego obecnego komentarza nie wiem o wątkach PHP. Przyszedłem poszukać odpowiedzi tutaj, ale jednym obejściem jest to, że program PHP, który odbiera żądanie z serwera WWW, przekazuje całą formułę odpowiedzi do aplikacji konsolowej, która przechowuje dane wyjściowe, odpowiedź na żądanie, w pliku binarnym a program PHP, który uruchomił aplikację konsolową, zwraca ten plik binarny bajt po bajcie jako odpowiedź na otrzymane żądanie. Aplikację konsolową można napisać w dowolnym języku programowania działającym na serwerze, w tym w tych, które mają odpowiednią obsługę wątków, w tym w programach C ++ korzystających z OpenMP.
Jedną niewiarygodną, brudną sztuczką jest użycie PHP do uruchomienia aplikacji konsolowej „uname”,
i wydrukuj wynik tej komendy konsoli na wyjściu HTML, aby znaleźć dokładną wersję oprogramowania serwera. Następnie zainstaluj dokładnie tę samą wersję oprogramowania w instancji VirtualBox, skompiluj / zmontuj wszystko, co w pełni samodzielne, najlepiej statyczne, pliki binarne, które chcesz, a następnie prześlij je na serwer. Od tego momentu aplikacja PHP może używać tych plików binarnych w roli aplikacji konsoli, która ma właściwe wielowątkowość. Jest to brudne, niewiarygodne obejście problemu, gdy administrator serwera nie zainstalował na serwerze wszystkich potrzebnych implementacji języka programowania. Należy zwrócić uwagę na to, że przy każdym żądaniu otrzymania aplikacji PHP aplikacje konsolowe kończą działanie / exit / get_killed.
Co do tego, co administratorzy usług hostingowych myślą o takich wzorcach użytkowania serwera, myślę, że sprowadza się to do kultury. W Europie Północnej usługodawca MUSI DOSTARCZYĆ, CO ZOSTAŁO REKLAMOWANE, i jeśli zezwolono na wykonywanie poleceń konsoli i przesyłanie plików innych niż złośliwe oprogramowanie było dozwolone, a usługodawca ma prawo zabić dowolny proces serwera po kilku minutach, a nawet po 30 sekundach , wówczas administratorzy usług hostingowych nie mają żadnych argumentów za sformułowaniem właściwej skargi. W Stanach Zjednoczonych i Europie Zachodniej sytuacja / kultura jest bardzo różna i uważam, że istnieje duża szansa, że w USA i / lub Europie Zachodniej dostawca usług hostingowych odmówi obsługi klientów usług hostingowych korzystających z wyżej opisanej sztuczki. To tylko moje przypuszczenie, biorąc pod uwagę moje osobiste doświadczenia z USA usługi hostingowe i biorąc pod uwagę to, co słyszałem od innych na temat usług hostingowych w Europie Zachodniej. W chwili pisania mojego obecnego komentarza (2018_09_01) nie wiem nic o normach kulturowych południowoeuropejskich dostawców usług hostingowych, południowoeuropejskich administratorów sieci.
źródło
Być może coś mi umknęło, ale exec nie działało tak asynchronicznie dla mnie w środowisku Windows, którego użyłem w Windowsie i działało jak urok;)
źródło
Wielowątkowość oznacza wykonywanie wielu zadań lub procesów jednocześnie, możemy to osiągnąć w php za pomocą następującego kodu, chociaż nie ma bezpośredniego sposobu na osiągnięcie wielowątkowości w php, ale możemy osiągnąć prawie takie same wyniki w następujący sposób.
}
Test_1.php
Spowoduje to wykonanie testu_1.php dwa razy jednocześnie i oba procesy będą działały jednocześnie w tle, dzięki czemu można uzyskać wielowątkowość w php.
Ten facet wykonał naprawdę dobrą robotę Wielowątkowość w php
źródło