Ver Mensaje Individual
  #1 (permalink)  
Antiguo 10/06/2009, 03:36
napalm_jp
 
Fecha de Ingreso: noviembre-2005
Mensajes: 28
Antigüedad: 18 años, 5 meses
Puntos: 0
Servidor con sockets multihilo

Buenas a todos,

Llevo tiempo buscando como implementar un servidor con sockets en php que sea realmente multitarea pero no logro encontrar información.

El problema es que tengo el siguiente código:

Código PHP:
// CODIGO DEL SERVIDOR
$socket socket_createAF_INETSOCK_STREAMSOL_TCP );
socket_bind $socket'localhost',  2222 );
socket_listen $socket );
socket_set_nonblock $socket );  // No bloqueante

while( true ) {
    
    if ( ( 
$peticion = @socket_accept$socket ) ) !== false ) {
        
        
$msg socket_read $peticion2048 );    
        
        
// Hilo de ejecución
        
        
@shell_exec'php core.php' );  ///// Punto conflictivo //////
    
        //socket_write ( $peticion, $respuesta, strlen($respuesta) );

    
}
    
    
usleep 100000 ); // 100 milisegundos
    
}

socket_shutdown($socket);
socket_close($socket); 

Lo que quiero conseguir es que cuando el servidor reciba una petición, este ejecute un proceso php que lance el fichero core.php y se olvide ya de procesar la petición del cliente, ya que esta debe de ser procesada por el proceso core.php.

Así, el servidor queda liberado de la tarea de procesar las peticiones y se dedica solamente a aceptarlas por medio del socket.

El problema es que el descriptor del socket lo genera el servidor (el código de más arriba) en $peticion, pero no encuentro la manera de pasar ese descriptor a core.php para que sea el proceso que ejecuta este fichero el que realice el socket_write que está comentado en el código.

No quiero que el socket_write lo realize el servidor porque si la ejecución del subproceso core.php dura 10 segundos el servidor esperará esos 10 segundos a obtener la respuesta de shell_exec y quedará bloqueado durante ese tiempo sin aceptar peticiones entrantes.

Estoy empezando a pensar ya que no va a ser posible hacerlo, porque ambos procesos no comparten espacio de memoria y por tanto el descriptor abierto por el servidor no puede ser utilizado por el proceso lanzado por shell_exec (o proc_open), pero espero que alguien me pueda ayudar o aclarar esta duda.

Un saludo y gracias de antemano.