Trabajando con sockets en php

La mayoría de las veces picaremos código en php para acceder a una base de datos, hacer una consulta y construir una salida html. Esto es lo fundamental que todo programador php debería saber. Pero por otro lado también hay que conocer cómo trabaja php con los sockets, y digo esto porque me lo han preguntado hoy en una breve tanda de preguntas para un puesto en una empresa de mi ciudad y no he dado la talla. Desde luego sabía lo que era un socket y para qué se usan, la teoría básica, pero nunca había practicado con ellos bajo php. Así que si alguna vez os hacen esta pregunta agradeceréis haber perdido dos minutos en leer este articulillo ;)

Antes de nada, ¿qué es un socket?. Bueno, el término de socket se engloba en el ámbito de las redes de comunicación y se podría definir como una librería TCP/IP cuya función es controlar el tráfico de paquetes entre dos nodos interconectados. A groso modo se puede interpretar como un canal a través del cual se comunican dos computadoras. Cada vez que nos conectamos a nuestro servidor de correo, chateamos con nuestra novia o navegamos por la web nuestro ordenador abre uno o más sockets a través de los cuales envía y recibe información.

Sockets hay de varios tipos (de flujo, de datagrama, puros…) aunque no voy a profundizar en esto ahora porque me eternizaría. Para más información podéis ver la Guía Beej de Programación en Redes.

Y ¿puede php trabajar con sockets?. Pues sí, a tamaños altares llega su magnificencia ^_^ Quien haya trabajado alguna vez con php o alguno de sus frameworks de desarrollo habrá comprobado que php permite hacer cosas realmente potentes, entre ellas conectarse a un servidor de correo y comunicarse con él.

Vale vale, ¿y cómo abro una conexión desde php para leer mi correo?. Evidentemente con un par de funciones la mar de sencillas: fsockopen(), fclose(), fgets() y fputs(). Sabiendo un poco de inglés se puede intuír qué hace cada una de ellas: fsockopen abre el socket y fclose lo cierra mientras que con fgets y fputs podemos sacar o pasar datos respectivamente. Para abrir el socket necesitaremos una ip o un nombre (si disponemos de servicio DNS) así como un puerto de conexión que dependerá del protocolo con el que queramos trabajar: 80 para HTTP, 25 para SMTP…

En la práctica, para comunicarnos con nuestro servidor de correo (target.com), sería algo tal que así:

1.- ABRIMOS EL SOCKET CON EL SERVIDOR/MÁQUINA REMOTA:

$objetivo = "target.com";
$puerto = "25";
$conexion = fsockopen($objetivo,$puerto);
if (!$conexion) {
     echo "Connection failed!. Cannot open socket.\\n";
     exit();
} else {
     echo "Connection accepted!. Socket opened successfully.\\n";
     $str_data = fgets($conexion,1024);
     print_r($str_data); //Mostramos la salida del servidor
}

2.- ENVIAMOS EL SALUDO EHLO AL SERVER:

$str_saludo = "EHLO target.com\\r\\n";
if(!fputs($conexion,$str_saludo)) {
     echo "EHLO refused by server.\\n";
     exit();
} else { //Si lo acepta podemos continuar trabajando por aquí
     echo "EHLO accepted by server.\\n";
     $str_data = fgets($conexion,1024);
     print_r($str_data); //Mostramos la salida del servidor
}

3.- UNA VEZ HAYAMOS OPERADO CON EL SERVIDOR CERRAMOS LA CONEXIÓN:

if(!fputs($conexion,"QUIT\\r\\n")) {
     echo "Disconnection failed!. Cannot say QUIT to server.\\n";
     exit();
} else {
     fclose($conexion);
     echo "End of connection to server.\\n";
     exit();
}

Como véis no hay que hacer gran cosa. Es bastante sencillo abrir, comunicar y cerrar un socket. La mayor complicación reside en saber cómo se comunica un determinado protocolo, qué comandos acepta y qué estructura debemos seguir a la hora de manipularlo.

En el ejemplo, justo después de enviar el saludo, podríamos haber usado cualquier comando SMTP para por ejemplo enviar un correo a una cuenta a través del servidor target.com, a saber:

MAIL FROM: correo@dominio //Para especificar el correo de origen
RCPT TO: correo@dominio //Para especificar el correo de destino
DATA\r\n Mensaje \r\n.\r\n //Para el cuerpo del mensaje

9 Respuestas to “Trabajando con sockets en php”


  1. 1 Marcos 3 noviembre 2007 a las 10:04 am

    ¡Hola!
    ¡Mágnífico tu artículo! ¡Enhorabuena!
    La verdad es que no tenía ni idea de que PHP podía conectar sockets y manipularlos con tal sencillez. A mí se me ocurre de pronto una utilidad que llevo tiempo persiguiendo y no sé cómo solucionar (pero no sé si será posible con php), te cuento:
    ¿Se podría hacer un chat de manera que cuando el servidor reciba datos de uno de los clientes responda al resto lo que ha escrito el primero y de esta manera que los clientes no tengan que estar sondeando de continuo una base de datos a ver si hay mensajes nuevos?
    A parte del chat típico, se me ocurren otras utilidades ya usando Flash… pero si lo anterior se puede hacer, el resto seguro que también.
    Gracias.
    ¡Un saludo!

  2. 2 epicentro 6 noviembre 2007 a las 11:38 pm

    Me alegro que te sea útil. Respecto al chat en PHP creo que es factible si lo combinas con alguna tecnología que te aporte ese refresco que PHP por sí solo no puede resolver como por ejemplo AJAX. Desde luego sería un proyecto interesante montar un chat de ese estilo en lugar del ya trillado Flash.

  3. 3 Jesu. 21 noviembre 2007 a las 9:39 pm

    interesante el articulo,
    tendrias algun ejemplo de como conectarse con asterisk via sockets con php,

  4. 4 leon 30 May 2008 a las 6:44 am

    perfecto despues de algunas pequeñas modificaciones tudo bom …merci me aventaste a mas de la mitad del camino

  5. 5 JUAN ANDRES 11 septiembre 2008 a las 5:39 pm

    hola como puedo hacer una conexion entre un socket en php y java

  6. 6 Fernando Muñoz 7 diciembre 2008 a las 7:55 pm

    Alguien preguntaba si se podia crear un chat en php con socket. El problema reside que los socket de php se conectan a servidores. Entonces primero deberiamos crear un servidor digamos que en c. Y luego nuestro segundo problema seria el refresco php no hace refreco. Solo lo hace ajax o el actualizar de nuestro navegador. Por ejemplo yo tengo varios servidores en c funcionando y desde un php puede mandarle instrucciones atraves de los sockets.

    Aunque si tomamos bien el concepto socket podriamos crear chat tranquilamente en otros lenguajes como c, java, que usan el mismo concepto en socket. PHP no ya que este genera codigo no ejecuta (HTML) y no ejecuta.

  7. 7 Enrique 6 May 2009 a las 11:18 pm

    el chat qued piensan ya esta hecho se trata de phpfreechat full PHP y ajax

  8. 8 epicentro 7 May 2009 a las 10:04 am

    Le he echado un vistazo y me parece una aplicación estupenda, muy configurable. Por ejemplo crear un nuevo comando es tan fácil como crear una nueva clase PHP.

    Desde que surgió AJAX y se hizo palpable su enorme potencial, combinándolo con PHP, creo que por la cabeza de todo programador ya bullía esta idea.

    Gracias por la nota Enrique ;)

  9. 9 Erick 13 agosto 2009 a las 2:33 pm

    Se puede probar esto en localhost? por que he copiado tu code y no pasa nada.


Replica a Marcos Cancelar la respuesta




Mi del.icio.us

May 2007
L M X J V S D
 123456
78910111213
14151617181920
21222324252627
28293031  

Archivador