Ho una funzione di utilità utilizzata per l'esecuzione di un programma tramite CLI (cmd, bash ecc.). Restituisce una serie di 3 articoli: STDOUT
, STDERR
e EXIT CODE
.PHP apre più volte proc_open
Finora, ha funzionato bene senza problemi. In effetti, il problema che ho con esso non ostacola realmente la sua funzionalità, ma sono preoccupato per le prestazioni.
Il problema è che in alcuni casi, PHP esegue lo stesso comando più volte (3 volte nel mio caso), anche se si supponeva di farlo solo una volta.
/**
* 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);
}
Prendere nota della riga commentata (riga 9). Questo era per i test. L'ho abilitato per garantire che il programma di destinazione venga eseguito una volta sola (stavo pensando che il mio codice potrebbe chiamare in qualche modo la stessa funzione). Ma anche con quella linea abilitata, il programma è ancora in esecuzione più volte.
Così com'è, ho 2 posizioni nel mio codice in cui sto eseguendo lo stesso programma (in diverse occasioni). La riga di comando è la stessa per entrambi.
Tuttavia, in un'occasione, il programma viene eseguito una volta, mentre nell'occasione, PHP esegue il programma 3 volte.
Ho monitorato e visualizzato questo comportamento in Process Explorer. Sto usando Windows 7 x64. Il programma è a 32 bit, così come PHP.
Modifica: Il programma in questione è personalizzato e non apre nuovi processi.
utilizzare un altro strumento di processo per verificare l'osservazione. Non hai menzionato quale programma è (potrebbe sborsare in sottoprocessi da solo). – mario
@Christian: come possiamo verificarlo? Come hai detto, non hai menzionato quale programma sia. Mario ha perfettamente ragione; dovresti ascoltarlo –
Scusate, volevo dire "controllato" (ora ho cancellato il commento per evitare confusione). Quello che ho voluto dire è che l'ho controllato con Process Monitor. Edit: E l'ho ascoltato;) lol – Christian