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_create( AF_INET, SOCK_STREAM, SOL_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 ( $peticion, 2048 );
// 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.