2012-03-18 20 views
18

Creo que los sockets php y las secuencias php se superponen entre sí.
He logrado crear un cliente de chat CLI PHP y un servidor, usando sockets o streams.Sockets Php vs Streams

Aquí algunas líneas de código que ilustran:
Uso de las tomas:

... 
$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"); 
... 

Utilizar Canales:

... 
$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"); 
... 

El punto aquí es que un cliente y un servidor se podrían hacer utilizando cualquiera de las funciones de sockets , cualquiera de las funciones de secuencias.

Sé que Streams es parte del núcleo de PHP y Sockets es una extensión.

Mi pregunta (s) es (son):

  • ¿Cuál es la diferencia entre cuencas y arroyos cuando se refiere a la programación de sockets?
  • ¿Existen capacidades, relacionadas con la programación de sockets, que una pueda tener mientras que la otra no?
+0

@JamWaffles Gracias por editar y disculpas por mi inglés. –

+0

No hay problema. Su inglés es casi perfecto, por lo que no hay nada de qué preocuparse :) – Bojangles

Respuesta

9

De acuerdo con el manual, la extensión de los zócalos es más baja. Por ejemplo, un poco con tomas usted tiene un control más preciso al crear uno, y puede elegir SOCK_STREAM, SOCK_DGRAM, SOCK_SEQPACKET, etc.

La extensión de sockets implementa una interfaz de bajo nivel a las funciones de comunicación de sockets basados ​​en la popular Sockets BSD, que brindan la posibilidad de actuar como servidor de socket y como cliente.

Para obtener una interfaz de socket más genérica del lado del cliente, vea stream_socket_client(), stream_socket_server(), fsockopen() y pfsockopen().

fuente: http://www.php.net/manual/en/intro.sockets.php

+1

¿* * más bajo nivel * significa más rápido? – Pacerier

+0

No necesariamente, solo significa que tiene más control sobre lo que está sucediendo. Sin embargo, puede usar ese control más fino para mejorar la velocidad en algunos casos. – serans

4

Como usted ha señalado, 'corrientes' están en PHP núcleo (built-in, siempre disponible), mientras que 'enchufes' son parte de una extensión rara vez se incluye. Aparte de eso, son casi idénticos. Puede usar tanto TCP como UDP con transmisiones con ambos modos, así como de bloqueo y no bloqueo, que cubre el 99% de todos los casos de uso.

La única excepción común que puedo pensar es ICMP. Por ejemplo, 'ping'. Sin embargo, parece que actualmente no existe una forma segura de hacer ICMP desde PHP. Tales llamadas requieren SOCK_RAW a través de la extensión de socket, que requiere la ejecución de privilegios 'raíz'. Además, no todos los enrutadores encaminarán otros tipos de paquetes fuera de TCP, UDP e ICMP. Esto limita la utilidad de la extensión de socket.