Tengo una función de utilidad utilizada para ejecutar un programa a través de CLI (cmd, bash, etc.). Devuelve una matriz de 3 elementos: STDOUT
, STDERR
y EXIT CODE
.PHP proc_open abre varias veces
Hasta ahora, ha funcionado bien sin problemas. De hecho, el problema que tengo con eso realmente no obstaculiza su funcionalidad, pero me preocupa el rendimiento.
El problema es que en ciertos casos, PHP ejecuta el mismo comando varias veces (3 veces en mi caso), incluso si se suponía que solo lo hiciera una vez.
/**
* Executes a program and waits for it to finish, taking pipes into account.
* @param string $cmd Command line to execute, including any arguments.
* @param string $input Data for standard input.
* @param boolean $log Whether to log execution failures or not (defaults to true).
* @return array Array of "stdout", "stderr" and "return".
*/
public static function execute($cmd,$stdin=null,$log=true){
//static $once=true; if(!$once)die; $once=false;
$proc=proc_open($cmd, array(
0=>array('pipe','r'),
1=>array('pipe','w'),
2=>array('pipe','w') ), $pipes);
fwrite($pipes[0],$stdin); fclose($pipes[0]);
$stdout=stream_get_contents($pipes[1]); fclose($pipes[1]);
$stderr=stream_get_contents($pipes[2]); fclose($pipes[2]);
$return=proc_close($proc);
if($return!=0 && $log)
xlog('Error: Program execution returned failure.',$stdout,$stderr,$return);
return array('stdout'=>$stdout, 'stderr'=>$stderr, 'return'=>$return);
}
Tenga en cuenta la línea comentada (línea 9). Eso fue para probar. Lo habilité para garantizar que el programa objetivo solo se ejecute una vez (estaba pensando que mi código podría estar llamando a la misma función de alguna manera). Pero incluso con esa línea habilitada, el programa aún se ejecutó varias veces.
Como está, tengo 2 lugares en mi código donde estoy ejecutando el mismo programa (en diferentes ocasiones). La línea de comando es la misma para ambos.
Sin embargo, en una ocasión, el programa se ejecuta una vez, mientras que en la ocasión, PHP ejecuta el programa 3 veces.
He estado monitorizando y viendo este comportamiento en Process Explorer. Estoy usando Windows 7 x64. El programa es de 32 bits, al igual que PHP.
Edit: El programa en cuestión está desarrollado a medida, y no abre nuevos procesos.
utilizar otra herramienta proceso para verificar la observación. No mencionó qué programa es (podría dividirse en subprocesos por sí mismo). – mario
@Christian: ¿Cómo podemos verificarlo? Como dijiste, no mencionaste qué programa es. Mario tiene toda la razón; deberías escucharlo –
Lo siento, quise decir "lo revisé" (ahora he eliminado el comentario para evitar confusiones). Lo que (signifiqué) es que lo revisé con Process Monitor. Editar: Y lo escuché;) lol – Christian