Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] PHP Sockets i Apache - jak to połączyć?
Forum PHP.pl > Forum > Przedszkole
phpmack
Witam jak ugryźć taki temat:
Mamy serwis www który ma służyć do wizualizacji informacji przesyłanych ze zdalnych urządzeń GPRS.
Z pomocą przychodzi nam PHP Sockets dzięki któremu mogę otworzyć port i nasłuchiwać informacji z urządzenia GPRS,
problem w tym że skrypt czy też "mini serwer" PHP musi być uruchomiony poza apache w "czystym" PHP z wiersza poleceń bo inaczej nie działa - tzn. mi nie udało się go uruchomić i nie znalazłem też żadnego przykładu z takim rozwiązaniem. No a jeśli niema innego rozwiązania i skrypt wykonywany pod apache nie może otwierać i nasłuchiwać portów to jak rozwiązać problem komunikacji naszego serwisu stojącego na apache z "mini serwerem PHP" odbierającym dane po GPRS ? oczywiście z odebraniem danych nie ma dramatu bo skrypt mógł by je wrzucać do bazy danych a nasza strona by z niej czytała ale przy próbie wysłania czego do urządzenia GPRS jest już problem.... przynajmniej tak mi się wydaje....wink.gif reasumując:
1. czy nasz serwis www na apache może samodzielnie otwierać i nasłuchiwać porty - jeśli tak to jak to zrobić?
2. jeśli nie może i musi to robić niezależny skrypt to jak taki serwis poskładać do kupy, jak się komunikować z tym skryptem przesyłać dane między serwisem a skryptem itd....

mam nadzieje że mocno nie zamieszałem

pozdrawiam
erix
Ok, to własny serwer, czy jakiś wynajęty/shared? Jeśli to drugie, to na 90% firewall ISP-a.

Nie podałeś, na jakim porcie ma to nasłuchiwać, więc trochę to brodzenie w bajorze.
mls
Poprzedni wątek autora...

Cytat(phpmack @ 25.06.2011, 15:47:49 ) *
1. czy nasz serwis www na apache może samodzielnie otwierać i nasłuchiwać porty - jeśli tak to jak to zrobić?
2. jeśli nie może i musi to robić niezależny skrypt to jak taki serwis poskładać do kupy, jak się komunikować z tym skryptem przesyłać dane między serwisem a skryptem itd....


1. Może, ale nie porty używane przez Apache (lub cokolwiek innego) - jak otworzyć port i nasłuchiwać, to już raczej wiesz - patrz swój poprzednio utworzony wątek. Z tym wyjątkiem, że Apache na porcie innym niż HTTP (80) nie będzie raczej potrzebny.
2. Jeśli skrypt miałby działać osobno, to opcji jest co najmniej kilka. Można zrobić daemona (co akurat ja robię najczęściej), może też działać pojedynczej sesji użytkownika w prostej pętli, etc. Komunikować można się na dowolny sposób, ale chyba najprościej poprzez bazę danych.

Dodam, że w firmie robimy kilka serwerów (opartych o PHP) do komunikacji z urządzeniami takimi jak centralki alarmowe GPRS/LAN czy lokalizatory GPS i jak na razie nie było z tym żadnych problemów. Problemów z tym, że całość pisana jest w PHP smile.gif
phpmack
Oczywiście serwer własny więc mogę go konfigurować do woli

mam pytanie dotyczące tworzenia i otwieraniem portów w samej aplikacji bez pomocy zewnętrznego skryptu mam taki przykład który działa z linii komend a nie działa wywołany przez apache:
  1. <?
  2.  
  3. $host = "192.168.0.157";
  4. $port = 8010;
  5.  
  6. // create socket
  7. $socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");
  8.  
  9. // bind socket to port
  10. $result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n");
  11.  
  12. // start listening for connections
  13. $result = socket_listen($socket, 3) or die("Could not set up socket listener\n");
  14.  
  15. $spawn = socket_accept($socket) or die("Could not accept incoming connection\n");
  16. do
  17. {
  18. $input = socket_read($spawn, 26, 1) or die("Could not read input\n");
  19. echo "Received input: $input\n";
  20. } while (true);
  21.  
  22. socket_close($socket);
  23. ?>


dlaczego?

oczywiście port 8010 jest wolny wink.gif a apache nasłuchuje tylko na porcie 80
mls
Socketów nasłuchujących nie ma po co przypisywać do hosta. Zamiast $host (w socket_bind) podstaw 0 (zero).
Skąd ta pewność, że nie działa pod Apache? Tylko stąd, że nic się nie wyświetla? Po każdym echo dodaj flush(); smile.gif
phpmack
No i jednak działa mogę tworzyć i nasłuchiwać porty z poziomu aplikacji uruchomionej na apache biggrin.gif
Tylko uświadomiłem sobie że niesie to za sobą mnóstwo problemów i kombinacji :/ podstawowa sprawa - raporty z urządzeń muszą spływać do DB cały czas nie tylko na czas trwania sesji użytkownika więc wariant z mini serwerem PHP jest o wiele sensowniejszy.
Jak już pisałem wcześniej w tym wypadku do rozwiązania pozostanie problem komunikacji między serwerem PHP a aplikacją a więc:
1. odczyt danych - skrypt PHP wrzuca dane do DB a aplikacja sobie odczytuje tylko że będzie to całkowicie asynchroniczne, co w sytuacji gdy skrypt będzie zapisywał dane w DB a w tym samym momencie z poziomu aplikacji użytkownik będzie coś usuwał, wyszukiwał itd... silnik DB (InnoDB) zadba o to żeby nie było bałaganu czy trzeba się zając tym samemu ?
2. interakcja z urządzeniami GPRS z poziomu aplikacji? tutaj mam większy problem - na razie pomysł mam taki: do każdego połączenia serwerPHP <=> Urządzenie GPRS zestawiam drugie połączenie Aplikacja <=> serwerPHP i gadam z serwerem poprzez port TCP - ma to sens??

trzecia sprawa która mnie trapi to niekończące się pętle po stronie serweraPHP - a więc każdy otwarty socket to niekończąca się pętla która czeka na dane spływające z GPRS czy przy np. 100 urządzeniach nie będzie to duży kłopot? do tego tyle samo iteracji czekających na polecenia z aplikacji (to przy zastosowaniu sposobu j.w), do tego jakaś pętla musi latać po tabeli urządzeń i sprawdzać flagę aktywności aby zamykać i otwierać porty w razie włączenia wyłączenia urządzenia - czy są znane jakieś dobre praktyki przy tego typu zagadnieniach?
zegarek84
stream_select / socket_select
Guru - Multiplexing - doczytaj o czytaniu i zapisie do socketów w trybie nie blokowanym - w tym przykładzie bodajże tylko akceptowanie połączeń jest w trybie nie blokowanym pozostałe są w trybie blokowanym - skoro chcesz to zrobić asynchronicznie to musisz wszystko ustawiać w tryb nie blokowany - nie chce mi się teraz szukać przykładów

stream_set_blocking

jeśli to masz na unix'ie skorzystaj z uniksowych socketów ;]
phpmack
Jestem po lekturze zganień związanych z stream_select, socket_select itd...nie wiem czy wszystko dobrze rozumie - a być może że w ogóle tego nie rozumie wink.gif
Jak miał by działać taki mini server - sprawa podstawowa czyli funkcję stream i socket_select działają jako przełącznik na naszym sockecie, modyfikują tablice read, write w razie pojawienia się nowego połączenia ? i zwracają max indeks tablicy stąd wiemy ile mamy aktualnie połączeń - (w zasadzie dublują swoją funkcjonalnośćquestionmark.gif) następnie my iterujmy po wszystkich połączeniach sprawdzając czy nasi klienci nic nie piszą ewentualnie my piszemy do nich?
Oglądałem kilka takich skryptów z zastosowaniem różnych kombinacji funkcji stream, socket itd. i nie do końca rozumie różnicę między nimi np. czym się różni utworzenie socketu za pomocą "stream_socket_client" a "stream_socket_server" intuicyjnie wiadomo o co chodzi ale chociażby przykładowy serwer a linku w poście powyżej korzysta z funkcji "stream_socket_client" a nie server ?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.