2012-03-18 15 views
18

Myślę, że gniazda php i strumienie php nakładają się na siebie.
Udało mi się utworzyć klienta czatu CLI PHP i serwer, używając gniazdek lub strumieni.Gniazda php a strumienie

Oto niektóre ilustrujące wiersze kodu:
za pomocą gniazd:

... 
$main_socket = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("Cannot create socket.\n"); 
@socket_bind($main_socket, $host, $port) or die("Could not bind to socket $host : $port.\n"); 
@socket_listen($main_socket, 5) or die("Could not set up socket listener\n"); 
... 

Korzystanie strumienie:

... 
$main_socket = @stream_socket_server ("tcp://$host:$port", $errno, $errstr, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN) or die("Cannot create socket.\n"); 
$clients = array($main_socket); 
$clients_peername = array(array('port' => $port)); 

fputs(STDOUT, "Waiting for connections...\n"); 
... 

Chodzi o to, że klient i serwer mogą być wykonane użyciem albo poprzez gniazda funkcje , działają strumienie.

Wiem, że strumienie są częścią jądra PHP, a gniazda to rozszerzenie.

Moje pytanie (e) jest (są):

  • Jaka jest różnica między gniazdami i strumieni, gdy odnosi się do programowania gniazd?
  • Czy są jakieś możliwości związane z programowaniem gniazd, jakie można mieć, a drugie nie?
+0

@JamWaffles Dzięki za edycję i przepraszam za mój angielski. –

+0

Bez problemu. Twój angielski jest prawie idealny, więc nie ma się czym martwić :) – Bojangles

Odpowiedz

9

Zgodnie z instrukcją rozszerzenie gniazd jest bardziej niskopoziomowe. Na przykład, pokojowe gniazd masz kontrolę drobniejsze szczegółową podczas tworzenia jednego, a może wybrać SOCK_STREAM, SOCK_DGRAM, SOCK_SEQPACKET itd

Rozszerzenie gniazdo implementuje interfejs niskiego poziomu do funkcji komunikacyjnych gniazdo na podstawie popularnej Gniazda BSD, zapewniające możliwość działania zarówno jako serwer gniazd, jak i klient.

Aby uzyskać bardziej ogólny interfejs gniazda po stronie klienta, zobacz: stream_socket_client(), stream_socket_server(), fsockopen() i pfsockopen().

źródło: http://www.php.net/manual/en/intro.sockets.php

+1

Czy * więcej niskiego poziomu * oznacza szybsze? – Pacerier

+0

Niekoniecznie oznacza to tylko, że masz większą kontrolę nad tym, co się dzieje. W niektórych przypadkach możesz użyć tej dokładniejszej kontroli, aby poprawić prędkość. – serans

4

Jak podkreślił, „strumienie” są w PHP rdzenia (wbudowany, zawsze dostępny), podczas gdy „gniazda” są częścią rzadko dołączonego rozszerzenia. Poza tym są prawie identyczne. Możesz używać zarówno TCP, jak i UDP dla strumieni zarówno z trybem blokującym, jak i bez blokowania, który obejmuje 99% wszystkich przypadków użycia.

Jedyny wspólny wyjątek jaki mogę sobie wyobrazić to ICMP. Na przykład "ping". Jednak wygląda na to, że obecnie nie ma bezpiecznej metody wykonywania ICMP z PHP. Takie wywołania wymagają SOCK_RAW przez rozszerzenie gniazda, które wymaga uprawnień "root" do wykonania. Ponadto nie wszystkie routery będą kierować inne typy pakietów poza TCP, UDP i ICMP. Ogranicza to przydatność rozszerzenia gniazda.