STREAMING Y SOCKETS
Muchas veces cuando la gente escucha la palabra STREAMING se imagina ver vídeos o escuchar música por internet, pues nada mas equivocado que esto ya que cuando se habla de STREAMING se esta refiriendo a convertir cierto tipo de información en bits para poder ser enviado a través de un protocolo de internet.
Resulta que PHP es tan completo que este es capaz de recibir y enviar información por cualquiera de los protocolos de INTERNET ya sean TCP, UDP e ISMP.
Cuando hablamos de SOCKETS lo que quiere decir es que PHP es capaz de usar un puerto de la tarjeta de red para recibir y enviar información a través de el, para poder comunicarse con cualquier programa (Ya sea de escritorio o para la WEB) para trabajar con el.
En este sencillo ejemplo tratare de mostrar como se crea un código "servidor" y un código "cliente" para abrir un SOCKET y podamos enviar y recibir información a través de dicho socket.
IMPORTANTE: Para trabajar con SOCKETS es necesario habilitar DEFAULT_SOCKET_TIMEOUT y EXTENSION = PHP_SOCKETS.DLL en el PHP.INI
NOTA: No explicare los códigos ya que comente las lineas para su fácil comprensión.
CODIGO SERVIDOR
Código PHP:
Ver original<?php
// dejamos en cero para que la conexion acepte la conexiones a ese y esta nunca se cierre
// creamos el array que contiene la informacion que queremos buscar
$contenido = array('banano' => 10, 'manzana' => 18, 'peras' => 50); // la ip del servidor en la cual se va a crear el socket
$ip = '127.0.0.1';
// el puerto por el cual escuchara peticiones
$puerto = '7001';
/* CREANDO EL SOCKET
AF_INET sirve para especifcar el protocolo en que se basara la conexion (AF_INET - AF_INET6 - AF_UNIX)
SOCK_STREAM indica como se enviaran y recibiran los bytes en la conexion
*/
// vinculamos el puerto a la IP
socket_bind($socket, $ip, $puerto) or
die ('No se puede vincular el puerto a la IP'); // en caso de error lo mostramos para saber que pasa
// hacemos el que socket escuche peticiones
while(1){
// aceptamos la conexion que nos entre
// leemos la informacion que nos envian
// quitamos espacios y saltos de linea de lo que se lee
// escribimos lo que recibimos
echo "Ticker: $ticker";
// ahora si buscamos la informacion que leimos en el socket
// dentro del array de contenido
$precio = $contenido[$ticker];
}else{
// si no existe pues le decimos que lo que
// busco no esta dentro del contenido
$precio = "No se encontro el ticket";
}
// escribimos los resultados que encontramos dentro del
// array en el socket para que el cliente los lea
// cerramos la conexion de ese cliente
}
// cerramos la conexion global
?>
AF_INET - AF_INET6 - AF_UNIX SOCK_STREAM
CODIGO CLIENTE
Código PHP:
Ver original<?php
while(1){
// mostramos un mensaje de bienvenida y una breve explicacion
echo "Por favor ingrese un ticket, 'q' para salir: ";
// eliminamos espacion en blanco del principio y fin de la cadena
// y obtenemos los que se escribio
// si el usuario presiono Q pues lo sacamos de la aplicacion
if ($ticker == 'q'){exit;} // si escribio un ticket pues le imprimo lo que escribio
echo "Ticker = $ticker ";
// creo el socket
// SOL_TCP el tipo de protocolo que se utilizara para la transmision (SOL_TCP - SOL_UDP)
// La comparacion para verificar si el socket se creo correctamente
// debe ser con triple =
if($socket === FALSE){
echo 'Creacion del socket fallida.';
}else{
// nos conectamos al socket servidor
if($resultado === FALSE){
echo 'Conexion al socket fallida.';
}else{
// ahora escribimos en el socket para que el servidor
// lea lo que nosotros le enviamos
// leemos el resultado que el socket nos envio
// imprimimos el resultado que leimos
echo " $precio";
}
}
}
?>
Bueno ahora vamos a probar el código, para hacerlo vamos a hacer uso de la consola de comandos. Primero vamos a abrir el código servidor en una consola para que esta cree el socket y escuche las peticiones y después en otra consola de comando abrimos el cliente para que se conecte a ese socket:
NOTA: OJO yo uso appserv asi que la ruta del archivo la deben cambiar, en las citas por ejemplo muestro ruta de wamp
CODIGO SERVIDOR
Cita: C:\>php -f C:\wamp\www\servidor.php
La operación se ha completado correctamente.
Ese mensaje se muestra cuando la creacion del SOCKET fue exitosa y este esta esperando peticiones.
Ahora EN OTRA CONSOLA DE COMANDOS abrimos el cliente:
CODIGO CLIENTE
Cita: C:\>php -f C:\wamp\www\cliente.php
Por favor ingrese un ticket, 'q' para salir:
Apenas entremos PHP mostrara el mensaje que colocamos:
Cita: C:\>php -f C:\wamp\www\cliente.php
Por favor ingrese un ticket, 'q' para salir:
Ahora bien si nosotros colocamos un ticket valido como por ejemplo "banano" entonces PHP escribirá en el SOCKET esa información, después el código servidor leerá esa información, realizara la búsqueda en el array y si lo encuentra escribirá en el socket la cantidad de bananos que tenemos en el socket, la pagina cliente leerá esa información y nos la mostrara en la consola de comandos así:
RESULTADO
Cita: C:\>php -f C:\wamp\www\cliente.php
Por favor ingrese un ticket, 'q' para salir: banano
Ticker = banano 10
Por favor ingrese un ticket, 'q' para salir:
Como ven queda esperando por si queremos hacer mas consultas (Para eso son los while), pero como no queremos pues presiona "q" a ver que pasa:
RESULTADO
Cita: C:\>php -f C:\wamp\www\cliente.php
Por favor ingrese un ticket, 'q' para salir: banano
Ticker = banano 10
Por favor ingrese un ticket, 'q' para salir: q
C:\>
Como ven nos saco del programa.
Bueno eso es todo, espero que esto le ayude a la gente que esta comenzando en este mundo de PHP y que a veces se hace un poco complicado.
NOTA: Ya se que EREG_REPLACE esta depreciada y se desaconseja su uso pero quise hacer el ejemplo lo mas sencillo posible.