Comunidad de diseño web y desarrollo en internet online

Crear un socket server con PHP

Ahora que tengo tiempo libre quise hacer un socket server local en Windows en PHP, aunque también funciona en Linux o Mac. Los socket servers permiten hacer aplicaciones multiusuario como chats, juegos o cualquier cosa que requiera tiempo real.

Recomiendo que lean el manual de PHP en el apartado de sockets, la información esta muy entendible y muy facil de digerir. También lee las Diferencias al trabajar con PHP en Linux y Windows. Les voy a explicar como lo hice:

Ingredientes para un socket server en PHP


  • WAMPserver 2.0
  • PHP 5.2.9-2 (Por defecto no va a venir instalado, pero lo pueden conseguir aquí). Tuve muchos problemas con la versión 5.3.0.
  • Apache 2.2.11 (opcional, yo trabaje con esta versión)

Especial cuidado en esto! deben de tener activa la extensión para sockets de PHP. La pueden activar desde del icono de wampserver: Clic izq. en el icono >> PHP >> Extensiones de PHP >> clic en: php_sockets

O directamente en el archivo php.ini Clic izq. en el icono >> PHP >>php.ini
Y buscan esta línea: extension=php_sockets.dll A la cual le quitan el punto y coma que tiene al inicio.

Una vez hecho esto, reinician el wampserver.


Para tener información más completa acerca de su PHP, pueden respaldar el archivo index.php que esta en la carpeta 'www' y crear su propio phpinfo, esto se hace creando un nuevo archivo index.php, pero ahora con esta línea:

Código :

<?php phpinfo(); ?>


Ahora pueden verificar el estado de su PHP, y buscar si ya tienen activada la extensión para sockets, para esto busquen este apartado y verifiquen que Sockets Support sea 'enabled':


Ahora tenemos que crear nuestro demonio o daemon, este se encargará de escuchar en todo momento nuestras peticiones como clientes y de enviarnos las respuestas del servidor. Yo utilice este sencillo script que está en el apartado de 'socket_accept' en el manual de PHP y en específico en la ayuda para sockets:

Código :

<?php
$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
socket_bind($socket,'127.0.0.1',65500);
socket_listen($socket);

echo "Esperando conexión\n\n";
$conn = false;
switch(@socket_select($r = array($socket), $w = array($socket), $e = array($socket), 60)) {
case 2:
echo "Conexión rechazada!\n\n";
break;
case 1:
echo "Conexión aceptada!\n\n";
$conn = @socket_accept($socket);
break;
case 0:
echo "Tiempo de espera excedido!\n\n";
break;
}


if ($conn !== false) {
// communicate over $conn
}


?>


Lo guardamos en la carpeta 'www' del wampserver.

Ahora algo interesante y crucial para que esto funcione en windows. En muchos de los ejemplos que estuve viendo aparece una línea un poco extraña (para los que no estamos muy familiarizados con Linux):

Código :

#!/usr/local/bin/php –q 


Esta línea en Linux funciona para apuntar hacia la ubicación de nuestra CLI de PHP.

Esto sirve para ejecutar el archivo binario de la CLI y el archivo que lo contenga se inicialice al arrancar nuestro servidor y se mantenga activo en segundo plano (algo así como un servicio).

Pero lo que nosotros necesitamos en windows es crear un proceso que mantenga activo a nuestro demonio o daemon, para esto crearemos un archivo con formato .bat el cual (de preferencia) guardaremos en la carpeta del wampserver (en mi caso c:/wamp), el archivo debe incluir la siguiente línea:

(Lo pueden crear con el bloc de notas)

Código :

c:/wamp/bin/php/php5.2.9-2/php.exe -q c:/wamp/www/socket.php


En donde:

c:/wamp/bin/php/php5.2.9-2/php.exe > Apunta hacia la ruta de nuestra CLI en windows.

c:/wamp/www/socket.php > Apunta a nuestro script PHP que funciona como demonio.

Ahora para ejecutarlo necesitamos acceder a él por medio del línea de comando en windows, presionamos la combinación de teclas 'Windows + R' escribimos cmd y presionamos enter.

Una vez abierta la ventana de línea de comandos, si nuestra instalación del wampserver está en c:/, tecleamos: c:/wamp/run

Y tendrán que ver algo igual a esto:



Si quieren tener un poco más de comodidad para iniciar este proceso, pueden crear un acceso director en el escritorio:

Clic derecho en el escritorio >> Nuevo >> Acceso directo >> pegan esta línea:

Código :

cmd /k c:/wamp/run


¡Listo! Con esto ya deberíamos tener nuestro servidor funcionando, ahora solo falta probarlo, creamos un script PHP con el siguiente código:

Código :

<?php
/*
*http://www.php.net/manual/en/ref.sockets.php
*/

$host = "127.0.0.1";

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$puerto = 65500;

if (socket_connect($socket, $host, $puerto))
{
echo "\nConexion Exitosa, puerto: " . $puerto;
}
else
{
echo "\nLa conexion TCP no se pudo realizar, puerto: ".$puerto;
}
socket_close($socket);
?>


Lo pueden llamar conectar.php y lo guardan en la carpeta 'www' del wampserver, finalmente lo ejecutan desde su navegador: http://localhost/conectar.php

y deberían tener algo igual a esto:



Y como postre:


Si quieren que su servidor sea visto por todos los equipos de su red, pueden hacer esto:

Clic izq. en el icono de wampserver >> Apache >> httpd.conf

Hagan un respaldo del archivo antes de hacer esto!!

Busquen la línea:

Código :

ServerName 127.0.0.1:80


Pueden ponerle una almohadilla o gato (numeral #) detrás de línea para comentarla, así: #ServerName 127.0.0.1:80

Ahora agreguen otra línea igual cambiando el 127.0.0.1 por la ip de su computadora, en mi caso:

Código :

ServerName 192.168.1.105:80


Guarden y reinicien el wampserver, ahora solo desde otro equipo de tu red teclea tu ip, ósea: http://192.168.1.105

Espero que sea de su agrado.

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate