Zócalos Php vs flujos

3 minutos de lectura

avatar de usuario
Catalina Enache

Creo que los sockets de php y las secuencias de php se superponen entre sí.
Me las arreglé para hacer un cliente de chat CLI PHP y un servidor, usando sockets o flujos.

Aquí algunas líneas de código ilustrativas:
Usando enchufes:

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

Usando flujos:

...
$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 podrían crearse utilizando funciones de sockets o funciones de flujos.

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

Mi(s) pregunta(s) es(son):

  • ¿Cuál es la diferencia entre sockets y flujos cuando se refiere a la programación de sockets?
  • ¿Hay alguna capacidad, relacionada con la programación de sockets, que uno pueda tener mientras que el otro no?

  • @JamWaffles Gracias por editar y perdón por mi inglés.

    – Catalín Enache

    18 de marzo de 2012 a las 21:57

  • No hay problema. Tu inglés es casi perfecto, así que no hay de qué preocuparse 🙂

    – Bojangles

    18 de marzo de 2012 a las 22:09

avatar de usuario
serans

Según el manual, la extensión de los enchufes es de más bajo nivel. Por ejemplo, con los sockets tiene un control más detallado al crear uno y puede elegir SOCK_STREAM, SOCK_DGRAM, SOCK_SEQPACKET, etc.

La extensión de socket implementa una interfaz de bajo nivel para las funciones de comunicación de socket basadas en los populares sockets BSD, lo que brinda la posibilidad de actuar como servidor de socket y como cliente.

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

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

  • Lo hace más bajo nivel significa mas rapido?

    – Pacerier

    14 de julio de 2013 a las 20:18


  • No necesariamente, solo significa que tienes más control sobre lo que está pasando. Sin embargo, puede usar ese control más fino para mejorar la velocidad en algunos casos.

    – serans

    5 de agosto de 2013 a las 15:36

Como señaló, los ‘flujos’ están en el núcleo de PHP (incorporados, siempre disponibles) mientras que los ‘sockets’ son parte de una extensión que rara vez se incluye. Aparte de eso, son casi idénticos. Puede usar TCP y UDP con secuencias con modos de bloqueo y sin bloqueo, lo que cubre el 99% de todos los casos de uso.

La única excepción común que se me ocurre es ICMP. Por ejemplo, ‘ping’. Sin embargo, parece que actualmente no hay una forma segura de hacer ICMP desde PHP. Dichas llamadas requieren SOCK_RAW a través de la extensión de socket, que requiere privilegios de ‘raíz’ para ejecutarse. Además, no todos los enrutadores enrutarán otros tipos de paquetes fuera de TCP, UDP e ICMP. Esto limita la utilidad de la extensión del zócalo.

¿Ha sido útil esta solución?