Sockets en PHP
Sockets en PHP
Sockets en PHP
Sockets en PHP
2014
Alexander Eberle
Blog.std-io.com
2014
Sockets en PHP
Sockets en PHP
Contenido
Notas del autor
Introduccin
3
3
4
4
Dependencias iniciales
5
5
5
7
8
8
8
9
9
10
10
10
Posibles problemas
11
Alexander Eberle
2014
Sockets en PHP
Introduccin
1. Notas de autor
En ste documento utilizaremos la versin actual estable de PHP Socket Master (v0.4), aunque es
probable que veas este documento en una fecha muy superior, por lo que posiblemente la versin nueva
sea otra; por ste motivo, se enlazarn todas las referencias a la wiki del proyecto, para que puedes
acceder a las descripciones actualizadas de la biblioteca.
Adems, el autor de ste documento asume que t, como lector, posees conocimientos sobre el lenguaje
PHP.
2. Introduccin
La idea de este documento es demostrar las funcionalidades bsicas de PHPSocket Master y cmo utilizar
sockets en php.
La razn por la que se usa una biblioteca externa a php para manipular sockets, es que el control nativo
de php para manipular sockets es horroroso, y bastante complicado de utilizar de forma robusta y
correcta. Por otro lado PHPSocketMaster nos provee de las herramientas necesarias para hacer un
software robusto y funcional bajo muchsimas circunstancias.
3. Qu son los sockets?
A menudo, las aplicaciones desean conectarse a otras [aplicaciones] en otras pc a travs de una red (ya
sea internet, o una red local), para lo cual se utilizan sockets. Los sockets son conectores entre dos partes:
una de ellas es el cliente (aqul programa que desea conectarse a otro) y la otra parte, es el servidor
(aquel programa que espera las conexiones entrantes de la gente que se desea conectar a l).
Sockets veremos por todas partes, sockets hay en un navegador de internet, sockets hay en un servidor
web, sockets hay en el sistema de actualizaciones de Windows, tambin los hay en cualquier lugar donde
una pc se conecte a otra.
3.1. Arquitectura Cliente/Servidor
El funcionamiento de todos los sockets es el siguiente: un cliente que es el que se conecta, y un servidor
que es el que escucha, el mismo puede aceptar una cantidad limitada de conexiones o una cantidad
infinita (sin especificacin), o simplemente uno.
Entonces deducimos que Apache (o cualquier otro webserver) tiene un socket a la escucha (esperando
conexiones entrantes) y que nuestro navegador es uno de los miles de navegadores que establecern una
conexin, pedirn un archivo y luego finalizarn la conexin.
Ahora bien, en otros tipos de programas los sockets no establecen conexiones a largo plazo. Por el
contrario un servidor chat por ejemplo, los sockets permanecen abiertos enviando y recibiendo mensajes
que se envan desde y hacia un servidor, luego el servidor que recibe los mensajes los distribuye por el
resto de las pc conectadas.
2014
Alexander Eberle
Veamos el sistema de las pginas web: tu navegador se conecta a un servidor mediante el socket, y le
pide al servidor que le enve X archivo; el servidor por su parte, carga el archivo en memoria y se lo enva
al cliente, para que ste lo dibuje para la persona que lo est viendo.
Sockets en PHP
Dependencias iniciales
Para trabajar con sockets en php uso la librera PHPSocketMaster (una librera de desarrollo propio que
lleva al menos 3 meses en desarrollo, con su versin actual (0.4), planificando una futura versin final
1.0; advirtiendo que, en realidad, no va a ser la versin final sino que tendr la estructura definitiva.
Esta librera tiene la funcionalidad de trabajar con Sockets comunes pero tambin con Sockets Webs
encargndose de manipular internamente los handshake y enmascaramientos de los datos enviados sin
que tengas nada que ver; para ti la diferencia entre sockets y sockets webs ser simplemente de escribir
una constante en la utilizacin de una funcin clave (veremos ms adelante ste hecho).
Los sockets webs son aquellos creados por javascript haciendo uso de los sockets webs definidos por la
W3C, el resto de los sockets son sockets comunes y corrientes incluidos los del servidor web, se les llama
sockets webs porque son creados desde una pgina web hacia otro lugar.
Una vez descargado, lo que nos interesa poner en el directorio de nuestro proyecto es la carpeta del zip
llamada src (luego hay carpetas con ejemplos, y pruebas). Te recomiendo poner esa carpeta src con
el nombre de PHPSocketMaster dentro del directorio de tu proyecto, dado que src es la carpeta que
contiene los archivos del ncleo de PHPSocketMaster; luego debes incluir el archivo iSocketMaster.php de
esa carpeta, ya sea para usar sockets webs, como normales, ya sea en modo cliente como en servidor.
require(src/iSocketMaster.php);
Una vez que tienes incluido este archivo en tu cdigo ya es posible utilizar PHPSocketMaster.
2014
Alexander Eberle
Pueden descargar PHPSocketMaster desde aqu, ver la wiki del proyecto con la documentacin
actualizada desde aqu, y el repositorio del cdigo en github desde aqu.
Sockets en PHP
Pueden ver todos los eventos que existen en la versin actual de PHPSocketMaster aqu (documentacin
oficial y actualizada) ya que probablemente este documento -con el tiempo- no contenga nuevas
funciones o contenga funciones de eventos inexistentes. A la fecha de hoy, el mismo se encuentra
actualizado.
2014
Alexander Eberle
Es la funcin por defecto diseada para ejecutarse cuando se realice la conexin satisfactoriamente (es
importante establecer absolutamente TODAS las funciones de eventos aunque no hagan nada, ya que los
eventos ocurrirn de igual forma; entonces debe existir la funcin que ser llamada automticamente. Si
no se definen todas las funciones, php generar un fatal error en el momento que se trate de ejecutar el
cdigo ya sea que ocurra o no el evento, evitando que funcione).
Sockets en PHP
Alexander Eberle
Sockets en PHP
{
echo Mensaje recibido: .$message;
}
public function onError($errorMessage)
{
echo :( ocurri un error:. $errorMessage;
}
public function onNewConnection(SocketBridge $socket) { }
}
Simplemente escribimos una serie de mensajes, entonces cuando nuestro socket se desconecte, se
conecte o de un error mostrar dichos mensajes. Tambin cuando nuestro socket reciba un mensaje lo
mostrar. sta es slo una clase de ejemplo, puedes utilizar otras cosas para realizar las tareas de cada
uno de los eventos.
Una vez que tenemos escrito las acciones que realizar nuestro programa cuando ocurran los eventos,
escribiremos el cdigo que ser ejecutado no bien se ejecute el programa:
$socketCliente = new Cliente(google.com, 80);
Con esto, construimos una instancia de la clase que hicimos ms arriba. En realidad estamos creando un
socket con los eventos especificados arriba, el primer parmetro que se le pasa al constructor es la
direccin ip o dominio del pc al que nos queremos conectar (esto puede ser uno local, o uno de internet si
tenemos acceso a internet).
Ahora que tenemos creado nuestro socketCliente y estn especificados todos los eventos (las tareas que
realizar cuando ocurra cada cosa), realizaremos la conexin, al servidor que establecemos:
$socketClient->connect();
$socketClient->refresh();
La cual devolver un boolean, advirtiendo si hubo cambios de estado. Adems, si existiesen esos cambios
se llamarn a los eventos correspondientes (esta funcin revisa el estado en el momento, por lo que
debes revisar constantemente cambios en el estado del socket para advertirlos, es muy probable que en
2014
Alexander Eberle
Tambin, podemos ver si se recibieron nuevos mensajes, el socket se cerr, ocurri un error o lo que sea
llamando a la funcin:
Sockets en PHP
futuras versiones se agregue una funcin refreshLoop -que una vez que llames la funcinautomticamente revisar constantemente cambios en el socket y llamar a los eventos
correspondientes. Es til, si realizaras el resto de las tareas desde las funciones de eventos y no desde el
cdigo principal.
Puede revisar la lista de funciones del socket desde aqu (actualizada).
De esta manera, nosotros podemos enviar con send una peticin http a un servidor http como el de una
pgina web, y as obtener el contenido de la pgina web (puede encontrar el RFC del protocolo HTTP para
saber el formato con el cual enviar los mensajes para hacer la peticin). Cuando el servidor responda con
el contenido de la web que solicitamos ser ejecutada la funcin onReciveMessage y su parmetro
contendr la respuesta.
5.4. Cliente SocketWeb
Actualmente en la versin 0.4 no se incluye un cliente que responda al protocolo websocket, dado que es
muy poco probable que necesites crear un socket cliente web. El soporte socket web es para
PHPSocketMaster como servidor, donde puedes recibir conexiones desde sockets de una pgina web.
Alexander Eberle
2014
Sockets en PHP
$socketReceptor->refreshListen($socketCliente);
El parmetro de esta funcin debe ser una instancia de la clase newClient ya que contendr un nuevo
cliente cuando ocurra una nueva conexin.
Y adems, tenemos que refrezcar el estado de cada cliente creado (para lo cual debemos tener guardados
2014
Alexander Eberle
Sockets en PHP
2014
Alexander Eberle
ltimos detalles
10
Sockets en PHP
pruebas.
8. Posibles problemas
Es posible que tengas problemas al ejecutar un cdigo usando socket master, ya que ste depende de la
dll socket_php.dll; si llegas a tener este problema revisa que en el archivo php.ini se estn cargando los
archivos.
Tambin puede que tengas problemas al usar socket webs -desde la funcin onConnect de javascript si se
enva un mensaje en ese momento- generndose un error ya que an no se estableci el protocolo
handshake.
Por otra parte dependiendo de su versin de php, puede que tengas un problema con los Traits (los
mismos pueden ser omitidos e incorporados directamente a la clase, pero el desarrollo oficial no da
soporte a esta medida, de modo que corre por tu cuenta, aunque recomendamos actualices tu versin de
php)
En versiones anteriores de PHPSocketMaster podas tener problemas si tu versin no era php5.6; ya que
el trait singleton requiere de la ultima versin al da para funcionar, por lo que se implement una
versin de singleton compatible con versiones viejas de php; no obstante, puede que en un futuro esta
compatibilidad sea eliminada por lo que si tienes una versin vieja de php debe utilizar este archivo
9. End of file
Como despedida quiero agradecer a todos los lectores de mi blog, a la gente de underc0de.org que
siempre apoya mis documentos, trabajos, etc. Y proponerles que se den una vuelta por mi blog:
http://blog.std-io.com seguro encuentran cosas muy interesantes para leer.
Tambin puedes ver el repositorio oficial de PHPSocketMaster y ofrecer cualquier sugerencia que tengas
en mente.
Alexander Eberle
Como agradecimiento final, quiero agregar a Gabriela de underc0de que se tom un gran trabajo para
corregir mi documento.
2014
11