coge la información y corre

Trabajar con conexiones socket en PHP

31 de Octubre del 2007 Escrito por Alex Barros

Para aquellos que cuenten con CURL en su servidor, sabrán que esta biblioteca ofrece increíbles ventajas. Sin embargo en ocasiones no contamos con esta herramienta en el servidor, o necesitamos trabajar a un nivel más bajo; es decir, sin que CURL nos lo de todo masticadito.

Este nivel es el de interactuación entre máquinas a través de un protocolo (usualmente HTTP).

Voy a centrarme en el uso de la función fsockopen() y en las cabeceras HTTP. Aúnque estas conexiones abarcan más materia, estos puntos resultan más útiles y sencillos de entender.

Para iniciar una conexión con otro dominio de internet, crearemos un puntero mediante fsockopen. Este puntero referencia a la conexión que hemos establecido con el archivo de ese otro dominio, y podremos usar las funciones típicas de un puntero de archivo (fgets() y fputs() principalmente)

La función requiere de un parámetro obligatorio (el archivo remoto) y otros opcionales, que son:

  • Puerto: Cualquier máquina consta de diversos puertos. El 80 (ó 8080 en ocasiones) es el de HTTP (transferencia de documentos web), el que más nos interesa.
  • Error numérico: Número entero que identifica un error ocurrido. 0 si ha habido éxito
  • Error descriptivo: Define en lenguaje natural el error.
  • Tiempo de espera: Puedes indicarle el tiempo para que la conexión expire. Para tener mayor control de este tiempo, puedes usar también stream_set_timeout()

Un ejemplo de conexión usando esta técnica puede ser este:

  1. $da = fsockopen("www.example.com", 80, $errno, $errstr, 30);
  2. if (!$da) {
  3.     echo "$errstr ($errno)
  4. \n"; //ha ocurrido un error …
  5. } else {
  6.     $salida = "GET / HTTP/1.1\r\n"; //conexión usando HTTP1.1 y el metodo GET
  7.     $salida .= "Host: www.example.com\r\n"; //indico el host con el que quiero conectarme, disponible con parse_url()
  8.     $salida .= "Connection: Close\r\n\r\n"; //Cierro la conexion para no seguir gastando recursos
  9.  
  10.     fwrite($da, $salida); //le escribo las ordenes que acabo de generar
  11.     while (!feof($da)) { //recorro fila a fila el archivo
  12.         echo fgets($da, 128); //imprimo esta linea
  13.     }
  14.     fclose($da); //cierro el puntero
  15. }
  16.  

Como podemos observar, nos permite enviar las cabeceras HTTP que creamos oportunas, aúnque para hacer una conexión simple basta con las tres instrucciones indicadas en el ejemplo.

Para chequear el contenido de cualquier URL, sin pararse a personalizar cabeceras se puede emplear este simple script:

  1. function urlContent($host) {
  2.         $da = fsockopen($host, 80);
  3.         if (!$da) {
  4.                 return false;
  5.         } else {
  6.                 $salida = "GET / HTTP/1.1\r\n"; //conexión usando HTTP1.1 y el metodo GET
  7.                 $salida .= "Host: $host\r\n"; //indico el host con el que quiero conectarme, disponible con parse_url()
  8.                 $salida .= "Connection: Close\r\n\r\n"; //Cierro la conexion para no seguir gastando recursos
  9.  
  10.                 fwrite($da, $salida); //le escribo las ordenes que acabo de generar
  11.                 while (!feof($da)) { //recorro fila a fila el archivo
  12.                 $data .= @fgets($da, 128); //imprimo esta linea
  13.                 }
  14.                 fclose($da); //cierro el puntero
  15.                 return $data;
  16.         }
  17. }
  18.  
  19. //Ejemplo de uso
  20. $contenido = urlContent(‘codis.boozox.net’);
  21. echo nl2br(htmlentities($contenido)); //doy formato para leer el codigo

Ver en ejecución | Descargar:

urlContent.function.zip

El funcionamiento básico de los sockets es algo más complejo que CURL, pero si nuestro servidor no admite esta librería, este script nos vendrá de perlas en más de una ocasión.

Categorias: Código, PHP, Web |

Sigue una dieta equilibrada, y escribe un comentario al día. (Dr. Manuel Torreiglesias)

Hay 2 comentarios, pero nos falta el tuyo

Pepito Ha dicho:

muy bueno…

Liborio Ha dicho:

eso esta muy weno..
me hacia mucha falta algo komo eso….

del.icio.us meneame.net RSS

Buscar:

Gpsia Descubre y comparte rutas por todo el mundo, tomadas con GPS. Ver más Imaset Edita tus imágenes de Wordpress con este sencillo plugin. Ver más

¡Mi música es tuya!

Digo yo que...

Mis fotos de Flickr

Entradas Recientes

Meta:

Respeta el copyleft

,