Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Detener socket en un servidor php

Estas en el tema de Detener socket en un servidor php en el foro de PHP en Foros del Web. Hola! este es mi primer post , le explico mi problema resulta que necesito un servidor web con sockets en php, ya tengo un pequeño ...
  #1 (permalink)  
Antiguo 12/02/2013, 14:06
 
Fecha de Ingreso: febrero-2013
Mensajes: 11
Antigüedad: 11 años, 2 meses
Puntos: 0
Busqueda Detener socket en un servidor php

Hola! este es mi primer post , le explico mi problema resulta que necesito un servidor web con sockets en php, ya tengo un pequeño programa que hace esa función en mi servidor lo llamo ServerSocket.php , mi pregunta se enfoca en que dentro de este archivo tengo un bucle infinito para que este siempre esperando conexiones, existe alguna forma de detener la ejecución del ServerSocket.php sin reiniciar el servidor es decir con alguna función o algo, esto lo necesito para cuando quiero modificar algo del código de este archivo no tenga que estar cambiando de puerto, ya que si trato de ejecutarlo de nuevo sin cambiar el puerto me dice que ya existe una socket en ese puerto espero se entienda lo que pregunto.

Muchas gracias por sus respuestas!
  #2 (permalink)  
Antiguo 12/02/2013, 14:14
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 15 años, 11 meses
Puntos: 528
Respuesta: Detener socket en un servidor php

Dentro de tu bucle infinito debes tener una condición de salida, por ejemplo si entre los datos que recibe el socket hay una bandera de salida, terminas el bucle o todo el script.
  #3 (permalink)  
Antiguo 12/02/2013, 14:15
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Detener socket en un servidor php

Necesitas detener el proceso si o si, sobre todo porque imagina que el código que modificaste contiene la definición de una clase o hiciste cambios a una función.

No puedes simplemente recargar el script y esperar a que no existan conflictos, ya que php te va a dar un error fatal de que la clase/función ya ha sido declarada.

Como puedes ver no es buena idea eso de recargar ciertas partes del código, a menos que estas contenga únicamente instrucciones.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #4 (permalink)  
Antiguo 12/02/2013, 14:20
 
Fecha de Ingreso: febrero-2013
Mensajes: 11
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Detener socket en un servidor php

Muchas gracias por tu respuesta, entiendo lo de detener el proceso pero como lo hago exactamente?, necesito reiniciar el servidor cada vez, es el problemas es que actualmente lo estoy probando de forma local pero la idea es colocarlo en un servidor web el cual no podría reiniciar cada vez muchas gracias por tu ayuda.
  #5 (permalink)  
Antiguo 12/02/2013, 14:22
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Detener socket en un servidor php

Pues a eso me refiero, necesitas reiniciar tu servidor.

Edito: esto es requerido para que puedas recargar tu código, si estuvieras usando algún otro servidor que soporte PHP como Apache no tendrías ningún problema.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #6 (permalink)  
Antiguo 12/02/2013, 14:23
 
Fecha de Ingreso: febrero-2013
Mensajes: 11
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Detener socket en un servidor php

ocp001a muchas gracias por tu respuesta también,una pregunta mas exactamente que tipo de bandera seria, mi conocimiento en php no es muy amplio, pero tampoco me siento un principiante en programación, si me pudieras dar una explicación mas detallada te lo agradeceria saludos y gracias!
  #7 (permalink)  
Antiguo 12/02/2013, 14:28
 
Fecha de Ingreso: febrero-2013
Mensajes: 11
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Detener socket en un servidor php

Gracias de hecho de forma local tengo una instalación de apache y php , pero me sucede lo mismo se queda ejecutando el mismo archivo de que forma lo podría detener, por que hasta ahora tengo que reiniciar la computadora y es un poco complejo de esa forma alguna idea ? gracias por tu tiempo
  #8 (permalink)  
Antiguo 12/02/2013, 14:32
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Detener socket en un servidor php

Puedes usar un archivo como puente, por ejemplo, en x ubicación un archivo que exista como PID, si existe el servidor funciona, cuando lo borres, el programa debe de detectar que ya no existe y pasas tu condición para que pare.
  #9 (permalink)  
Antiguo 12/02/2013, 14:33
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Detener socket en un servidor php

Entonces la clave debería estar en cómo es que inicias dicho proceso, y en dado caso, ¿qué sentido tiene entonces usar Apache si estás implementando el servidor únicamente con PHP?

No veo claro, no entiendo.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #10 (permalink)  
Antiguo 12/02/2013, 14:37
 
Fecha de Ingreso: febrero-2013
Mensajes: 11
Antigüedad: 11 años, 2 meses
Puntos: 0
Busqueda Respuesta: Detener socket en un servidor php

ok creo que tendré que ser un poco mas claro mi sitio web se divide en 2 la primera parte es una pagina que se conecta con una base de datos en mysql , y la segunda por la que pregunto es un socket que recibe conexion por tc/ip estas 2 funciones se encuentran en el mismo servidor es por ello lo de apache,

anexo el codigo del server para sugerencias

Código:
<?php

/* Permitir que el script permanezca en espera de conexiones. */
set_time_limit(0);
/*socket_create=>Crea y devuelve un recurso socket*/
$socket=socket_create(AF_INET,SOCK_STREAM,0);
 
/*0 - acepta cualquier conexion de cualquier ip*/
$direccion="127.0.0.1";
 
/*para el puerto no podemos utilizar numeros menores a 1025
/debido a que ya estan reservados para aplicaciones del sistema como correo electronico etc.*/
$puerto=4545;
 
/*socket_bind=>Vincula el nombre dado en $direccion al socket descrito por $socket.
Esto tiene que ser hecho antes de establecer una conexión
usando socket_connect() o socket_listen().*/
socket_bind($socket, $direccion,$puerto);
 
/*socket_listen=>Después de que el socket socket haya sido creado usando socket_create()
y vinculado a un nombre con socket_bind(), se le puede indicar
que escuche conexiones entrantes sobre socket.*/
socket_listen($socket);
 
/*Mientras sea verdadero se ejecuta, quiere decir que
siempre estara a la espera de nuevos clientes*/
 
$tamaño=2048;
while(1)
{
    $cliente=socket_accept($socket);
    $buffer=socket_read($cliente, $tamaño); //leemos mensaje del cliente
    $buffer="Hola, ".$buffer;
    socket_write($cliente, $buffer); //escribimos el buffer
    socket_close($cliente); //cerramos cliente
//socket_close=>cierra el recurso socket dado por $socket
}
    socket_close($socket);
?>
  #11 (permalink)  
Antiguo 12/02/2013, 14:46
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Detener socket en un servidor php

Como te digo necesitas usar un archivo o algo que mantenga el control de si debe de correr o no, en cuanto cambié la condición de ese archivo (o una base de datos o lo que sea) es cuando sales del while.
  #12 (permalink)  
Antiguo 12/02/2013, 15:24
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: Detener socket en un servidor php

Para evitar que el socket se quede ocupando el puerto, cuando el proceso que lo ocupaba ha muerto, busca la opcion SO_LINGER.
Por defecto, un socket se queda abierto durante un tiempo para notificar a los posibles paquetes que ya están en la red, de que ese socket ha sido cerrado.
  #13 (permalink)  
Antiguo 12/02/2013, 15:32
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: Detener socket en un servidor php

Aparte, como bien dice pateketrueke, no puedes re-recargar un fichero, si tienes definidas funciones o clases dentro de ese fichero (al menos en principio...no sé si jugando con Reflection se podrían hacer cosas).

Si no se declara ni define nada dentro del fichero, puedes hacer simplemente "include".
Obviamente, no he hecho (no he necesitado) nunca esto, pero, teóricamente, haciendo "include", recargarás el fichero cada vez.
  #14 (permalink)  
Antiguo 12/02/2013, 15:36
 
Fecha de Ingreso: febrero-2013
Mensajes: 11
Antigüedad: 11 años, 2 meses
Puntos: 0
Busqueda Respuesta: Detener socket en un servidor php

ok ok creo que ya voy entendiendo mejor, en realidad no se si el termino es recargar el archivo la idea que yo tenia era como de sustituir pero no se que tan funcional sea ,ahora en realidad no creo tener algún problema por clases o algo así ya que no estoy definiendo nada de eso pero lo tomare en cuenta gracias por su ayuda
  #15 (permalink)  
Antiguo 12/02/2013, 15:42
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: Detener socket en un servidor php

A ver, no te líes.Tu problema no es recargar el código, ni nada de eso.Es cerrar completamente el socket cuando paras el proceso, para no tener que cambiar el puerto.
Busca SO_LINGER.
  #16 (permalink)  
Antiguo 12/02/2013, 15:45
 
Fecha de Ingreso: febrero-2013
Mensajes: 11
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Detener socket en un servidor php

ok ya entendi muchas gracias por toda su ayuda buscare la función y después comento que tal va muchas gracias

Etiquetas: server, socket
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:53.