Ver Mensaje Individual
  #1 (permalink)  
Antiguo 25/07/2008, 12:55
Avatar de Negora
Negora
 
Fecha de Ingreso: agosto-2003
Mensajes: 122
Antigüedad: 20 años, 8 meses
Puntos: 5
Llamar a un programa con "proc_open" y e interactuar con él desde otro script

Hola majos:

Básicamente lo que necesito es lo siguiente... Un script PHP ejecutaría un programa mediante "proc_open ()". Finalizado dicho script, el comando seguiría en ejecución leyendo lo que le llegase por STDIN. Mediante otros scripts, se debería de poder interactuar con ese proceso en ejecución.

Para lograr algo así se me había ocurrido usar un fichero FIFO como STDIN, de tal modo que cada vez que se escriba en dicho fichero, sea desde el script que sea y en cualquier momento, el programa en ejecución recibiría ese parámetro como si lo introdujéramos a mano desde la consola. Consistiría básicamente en adaptar un programa de línea de comandos a una interface web. El programa está diseñado para funcionar mediante órdenes introducidas como texto y finalizadas con "\n".

He probado lo siguiente:

Código:
	// Uso "start" ya que me encuentro en un entorno Windows y es la única
	manera que conozco de poder ejecutar un comando sin que el script espere
	a su finalización.

	$cmd = "start \"\" /b myprogram.exe";
	

	// Redirijo la entrada a un fichero creado para la ocasión.
	$arr_desc = array (
		0 => array ("file", "c:/stdin_file", "r")
	);
	

	// Creo el proceso y lo finalizo (pero "myprogram.exe" sigue ejecutándose).
	$rsc_proc = proc_open ($cmd, $arr_desc, $arr_pipe);
	if (is_resource ($rsc_proc)) {
		$retval = proc_close ($rsc_proc);
	}


	// Abro en modo escritura el archivo y le indico el comando "test" junto con
	// un retorno de carro (necesario para que lo lea).
	$rsc_file = fopen ("c:/stdin_file", "a+");
	fwrite ($rsc_file, "test\n");
	fclose ($rsc_file);

Usando este ejemplo parece que el fichero no actúa como un fichero FIFO. ¿Se os ocurre una razón?

Otra idea que había tenido era "recuperar" desde otro script el proceso, usando comandos del propio SO y ejecutándolos mediante "proc_open"... ¿Pero es eso posible? ¿Se os ocurre otro método?

Un saludo y muchas gracias.