Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Stały proces PHP
phuria
post 21.08.2013, 09:12:16
Post #1





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 27.07.2013

Ostrzeżenie: (0%)
-----


Witam, piszę dość skomplikowaną aplikację i potrzebuję jakiegoś sposobu na uruchomienie przy starcie serwera procesu, który działałby cały czas. Taki proces zarządzałby pamięcią cashe i obsługiwał AJAX lub WebSockets. Ważne, żeby z takim procesem mogły się komunikować procesy powstałe w wyniku requesta.

W dokumentacji PHP nie udało mi się znaleźć nic pożytecznego. Sam wpadłem na pomysł zrobienia aplikacji konsolowej, którą bym ręcznie uruchamiał przy starcie serwera, a procesy requesta komunikowały by się z nią za pomocą Socketów. Nie przeprowadziłem jeszcze testów, ale domyślam się, że takie rozwiązanie mija się z celem (zbyt duża strata czasu na komunikację).

Opcjonalnie mógłbym zrobić jakiś extension, ale nie udało mi się znaleźć, żadnego sensownego manuala albo dokumentacji...

Czy jest może ktoś kto miałby pomysł jak rozwiązać ten problem?
Go to the top of the page
+Quote Post
sowiq
post 21.08.2013, 09:19:32
Post #2





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


PHP to IMO bardzo słaby wybór na proces działający w tle. Jeśli chodzi o rozwiązania socketowe to polecałbym Ci się zainteresować node.js

Co do zarządzania cache to może po prostu wybrałeś niewłaściwe rozwiązanie? A jeśli chodzi o zarządzanie pamięcią, to myślałem, że tym powinien zajmować się system operacyjny...

Możesz trochę dokładniej opisać co chcesz osiągnąć?
Go to the top of the page
+Quote Post
phuria
post 21.08.2013, 09:37:00
Post #3





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 27.07.2013

Ostrzeżenie: (0%)
-----


W bazie danych mam zapisane obiekty, przy pierwszej prośbie o dany obiekt zostaje on pobrany z bazy i zapisany przy użyciu APC do pamięci. Przy każdej kolejnej prośbie zwracany byłby obiekt bezpośrednio z pamięci. Obiekty które przez określony okres czasu nie byłby używane, zostały by usunięte (lub gdyby brakowało pamięci). Ogólnie rzecz biorąc baze danych chce używać jako kontenera na dane w chwili zamykania serwera.

Jeśli chodzi o samą komunikację socketów to wszystko mam już rozkminione i przetestowane. Potrzebuję jedynie pomysłu na zrobienie tego procesu i sposobu komunikacji z nim.

Mógłbym to w Java EE napisać pewnie, ale zależy mi na dynamicznym typowaniu PHP (no i Java jest jak dla mnie zbyt obiektowa, lubię obiektowość ale bez przesady).
A jeśli chodzi o JS, to pisanie w tym to istne piekło, więc node.js odpada.

Ten post edytował phuria 21.08.2013, 09:43:28
Go to the top of the page
+Quote Post
sowiq
post 21.08.2013, 09:44:37
Post #4





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


W takim razie, jak dla mnie chcesz na nowo wymyślać koło.

APC zostało raczej stworzone do optymalizacji czasu wykonywania kodu PHP, a nie jako silnik do trzymania cache.

Ja na Twoim miejscu raczej zainteresowałbym się Memcached lub Redisem.
Go to the top of the page
+Quote Post
destroyerr
post 21.08.2013, 09:48:18
Post #5





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

Ostrzeżenie: (0%)
-----


Potrzebujesz po prostu uruchomić proces który będzie wykonywał jakieś zadania. Pozostaje kwestia komunikacji z tym procesem. Tutaj jest podstawowe pytanie czy to ma działać na jednej maszynie (np. potoki) czy komunikacja ma być dostępna też przez sieć (gniazda).
Napisanie rozszerzenia do php przecież niczego nie zmienia w Twoim problemie. Nadal potrzebujesz uruchamiać proces i się z nim komunikować.

Cytat
PHP to IMO bardzo słaby wybór na proces działający w tle. Jeśli chodzi o rozwiązania socketowe to polecałbym Ci się zainteresować node.js

Możesz podać coś na potwierdzenie, że to słaby pomysł czy po prostu słaby i już. Można pozostać przy PHP: http://reactphp.org/ + http://socketo.me/.
Go to the top of the page
+Quote Post
sowiq
post 21.08.2013, 09:55:00
Post #6





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Cytat(destroyerr @ 21.08.2013, 10:48:18 ) *
Możesz podać coś na potwierdzenie, że to słaby pomysł czy po prostu słaby i już.

Oczywiście, że mogę. Co prawda nie wiem jak z PHP w wersjach >= 5.4, ale przy 5.3 było poważne problemy z wyciekami pamięci. Nie wiem czy to tylko kwestia samego PHP czy skrypt był po prostu kiepsko napisany. Tak czy siak był to deamon chata obsługujący max kilka tysięcy rozmów jednocześnie. Jego jedynym zadaniem było przekazywanie pakietów z jednego socketa na drugi. Nic nie zapisywał, tylko "podawał" wiadomości ze źródła do celu.

Po max kilku godzinach zużycie pamięci przez ten skrypt sięgało kilkunastu GB. Efekt był taki, że skrypt trzeba było co kilka godzin restartować żeby ratować serwer przed swapowaniem, co za każdym razem rozłączało wszystkich aktywnych użytkowników czata.

Ten post edytował sowiq 21.08.2013, 09:56:05
Go to the top of the page
+Quote Post
phuria
post 21.08.2013, 09:55:14
Post #7





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 27.07.2013

Ostrzeżenie: (0%)
-----


Komunikacja będzie się odbywała w obrębie jednej maszyny. Ogólnie szukam sposobu komunikacji który miałby sens, tzn. aby pobranie potrzebnych danych, było szybsze niż z bazy danych.

Ten post edytował phuria 21.08.2013, 09:55:35
Go to the top of the page
+Quote Post
sowiq
post 21.08.2013, 10:03:06
Post #8





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Czyli nie taki ten Twój problem skomplikowany jak go rysujesz wink.gif Po prostu potrzebujesz najzwyklejszego w świecie cacheowania.

Najzwyklejszy Memcache działa na RAM (szybkość), pozwala na ustawienie "czasu życia" danych przy zapisie (wymaganie 1.) i w razie zapełnienia pamięci usuwa dane, które były używane najdawniej - LRU [last recently used] (wymaganie 2.).

Czyli Jak Ci napisałem wcześniej - próbujesz na nowo wymyślać koło wink.gif

Powodzenia.
Go to the top of the page
+Quote Post
Crozin
post 21.08.2013, 10:03:42
Post #9





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


1. Wygląda na to, że do tego programu będzie chciało podłączać się wiele innych równocześnie. W takim przypadku PHP tutaj odpada - brak wsparcia dla współbieżności.
2. APC samo w sobie wspiera automatyczne usuwanie obiektów z pamięci: apc_store - trzeci argument.
3. Nie myślałeś o tym by wykorzystać bazę danych pracującą w pamięci i zrzucająca dane na dysk w tle?
4. Jeżeli zdecydowałbyś się na napisanie tego w Javie nie musiałbyś zaprzęgać do tego całej platformy JEE. Całą obsługę WebSocketów można zamknąć w kilkunastu-kilkudziesięciu linijkach kodu wykorzystując Netty'ego (świetna biblioteka).

PS. Mógłbyś jeszcze napisać co dokładnie chcesz cache'ować?

Ten post edytował Crozin 21.08.2013, 10:05:46
Go to the top of the page
+Quote Post
phuria
post 21.08.2013, 10:13:58
Post #10





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 27.07.2013

Ostrzeżenie: (0%)
-----


Crozin, przy użyciu pthreads i apc myślę, że uda mi się zaimplementować współbieżność. Jak to zrobię i przy użyciu czego to już mniejsza z tym.

Potrzebuję jedynie sposobu na uruchomienie jednego procesu który będzie to wszystko kontrolował tak jak ja chcę i sposobu najszybszej komunikacji z nim w obrębie jednej maszyny. Nie potrzebuję do tego bazy danych, ponieważ nie będę na tym wykonywał żadnych operacji sortowania, wyszukiwania etc. To ma być po prostu pamięć do której będzie miał dostęp każdy potrzebujący proces.

Ten post edytował phuria 21.08.2013, 10:24:54
Go to the top of the page
+Quote Post
Crozin
post 21.08.2013, 10:32:09
Post #11





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Fakt, możesz skorzystać z pthreads, ale to rozszerzenie udostępnia jedynie najbardziej podstawowe/niskopoziomowe elementy dla programowania współbieżnego. Pisanie czegokolwiek bardziej rozbudowanego będzie bardzo nieefektywne względem tego, co oferują inne platformy. Po prostu wykorzystaj odpowiednie narzędzie do tego zadania.

Jeżeli chodzi o komunikację: http://en.wikipedia.org/wiki/Inter-process_communication - wybierz sobie coś. wink.gif

Ten post edytował Crozin 21.08.2013, 10:34:07
Go to the top of the page
+Quote Post
jackraymund
post 21.08.2013, 10:40:43
Post #12





Grupa: Zarejestrowani
Postów: 217
Pomógł: 21
Dołączył: 10.06.2011
Skąd: Głogów

Ostrzeżenie: (0%)
-----


C++ bedzie najlepszym rozwiazaniem, zrobisz wszystko co chcesz, czas dostepu bedzie maly ze wzgledu na to ze na localhoscie, pamietaj rob wszystko na vektorach np. Usuwanie pamieci po czasie, i kazda inna listę i pamiętaj o optymalizacji kodu i aby kazda czynnosc osobno w innym watku (odbieranie socketow, usuwanie pamieci itd.)
Mozesz tez dorobic zabezpieczenia przed duzym ruchem trzymajac handle socketu w vektorze i uruchamiajac odpowiedzi w innym wątku.
Jak cos nie jasno to pisz


Up
Niema co wybierac tcp(sockety) jest najszybszym i opatentowanym sposobem

Ten post edytował jackraymund 21.08.2013, 10:44:17


--------------------
Wykonuje zlecenia na pobieranie danych ze stron i różne boty.
Go to the top of the page
+Quote Post
phuria
post 21.08.2013, 10:46:02
Post #13





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 27.07.2013

Ostrzeżenie: (0%)
-----


Zakładając, że ten kontroler pamięci i komunikacji napiszę w Javie:
1. W jaki sposób wyglądała by komunikacja aplikacja Java <-> proces PHP powstały w wyniku request?
2. Czy takie łącznie aplikacji ma sens?
3. Jaka będzie względna strata czasu na taką komunikację?

W C++ to m/w wiem jak sprawa wygląda.

Ogólnie to chciałbym to wszystko w PHP napisać, ale jeśli rzeczywiście pthreads jest takie złe...

Ten post edytował phuria 21.08.2013, 10:52:38
Go to the top of the page
+Quote Post
styryl
post 21.08.2013, 10:54:30
Post #14





Grupa: Zarejestrowani
Postów: 223
Pomógł: 27
Dołączył: 16.04.2008
Skąd: Bakutilu

Ostrzeżenie: (0%)
-----


Przecież najlepszy rozwiązaniem będzie node.js stawiasz sobie serwer masz do niego dostęp po HTTP oraz przez webscokety do tego mongodb i problem z głowy.
Go to the top of the page
+Quote Post
jackraymund
post 21.08.2013, 11:01:10
Post #15





Grupa: Zarejestrowani
Postów: 217
Pomógł: 21
Dołączył: 10.06.2011
Skąd: Głogów

Ostrzeżenie: (0%)
-----


1. Php wysyła requesta do serwera, a serwer do php. Chyba nie zrozumiałem pytania
2. sam nie wiem
3. Javą, ładnie zamulisz serwer, nie polecam.

Java może jest multiplatformowa, ale jest wolna, w porównaniu do c++.
Ogólnie nie polecam języków, które mają własny interpreter.


--------------------
Wykonuje zlecenia na pobieranie danych ze stron i różne boty.
Go to the top of the page
+Quote Post
Crozin
post 21.08.2013, 11:20:18
Post #16





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Cytat
[...] ale jeśli rzeczywiście pthreads jest takie złe...
Nie jest złe. Po prostu ta biblioteka robi to co do niej należy - udostępnia względnie niskopoziomowe API do obsługi wątków. A Ty, jako "użytkownik chcący skorzystać z współbieżności" będziesz potrzebował nieco bardziej złożonych obiektów. Zauważ, że nie masz gotowych tak podstawowych obiektów jak listy czy kolejki z obsługą współbieżności. Wszystko musiałbyś pisać samemu - a po co na to tracić czas?
Cytat
1. W jaki sposób wyglądała by komunikacja aplikacja Java <-> proces PHP powstały w wyniku request?
Dane musiałbyś zapisać do jakiegoś formatu rozumianego przez obie platformy. Możesz skorzystać z JSON-a albo samodzielnie pakować dane i przesyłać je w formie binarnej. Rozwiązań jest wiele.
Cytat
2. Czy takie łącznie aplikacji ma sens?
Z reguły wygodniej jest mieć cały kod napisany dla konkretnej platformy, ale dwa osobne programy w różnych technologiach nie są niczym złym.
Cytat
3. Jaka będzie względna strata czasu na taką komunikację?
Na to pytanie już Ci nie odpowiemy, bo nie wiemy jakie są Twoje oczekiwania. Ale zawsze możesz na szybko wykonać testy i zmierzyć to samemu.

Cytat
W C++ to m/w wiem jak sprawa wygląda.
To wszędzie będzie działać w mniej-więcej ten sam sposób.
Go to the top of the page
+Quote Post
phuria
post 21.08.2013, 11:35:03
Post #17





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 27.07.2013

Ostrzeżenie: (0%)
-----


Crozin, przepraszam, że nie wspomniałem, ale aplikację piszę wyłącznie dla siebie. Dlatego tak bardzo zależy mi na tym żeby w całości napisać ją w PHP. Chcę przy tym wymyślić parę kół i wyważyć parę otwartych drzwi. Piszę tę aplikację tylko po to żeby doskonalić swoje umiejętności, więc im więcej napiszę tym lepiej. Według mnie taka forma nauki jest najlepsza. Ogólnie staram się pisać niskopoziomowe elementy, by zrozumieć ich zasady działania.

Z tego co udało mi się tu dowiedzieć, to myślę że najlepszym rozwiązaniem będzie ptheards i apc (zobacze jeszcze te biblioteki co polecil sowiq), oraz komunikacja WebSocket pomiędzy procesami. Trochę mi się to dziwne wydaje, bo myślałem, że taka forma komunikacji jest bardziej stworzona do wymiany danych przez sieć, a nie w obrębie jednej maszyny. Myślałem, że może jest jakiś niskopoziomowy kanał komunikacji.

Ten post edytował phuria 21.08.2013, 11:36:59
Go to the top of the page
+Quote Post
destroyerr
post 21.08.2013, 11:54:15
Post #18





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

Ostrzeżenie: (0%)
-----


Cytat
oraz komunikacja WebSocket pomiędzy procesami. Trochę mi się to dziwne wydaje, bo myślałem, że taka forma komunikacji jest bardziej stworzona do wymiany danych przez sieć, a nie w obrębie jednej maszyny. Myślałem, że może jest jakiś niskopoziomowy kanał komunikacji.

Raczej zwykłe gniazda, po co od razu Web. Dla unixa masz też gniazda jako plik. W poprzednim swoim poście podałem Ci potoki (pipes) które można uznać za niskopoziomowe, a Crozin dał Ci link z możliwymi sposobami komunikacji.

Ten post edytował destroyerr 21.08.2013, 11:55:00
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 29.03.2024 - 13:45