2013-04-13 4 views

risposta

7

Controllare il secondo esempio nella documentazione su popen, mostra esattamente come fare:

<?php 
error_reporting(E_ALL); 

/* Add redirection so we can get stderr. */ 
$handle = popen('/path/to/executable 2>&1', 'r'); 
echo "'$handle'; " . gettype($handle) . "\n"; 
$read = fread($handle, 2096); 
echo $read; 
pclose($handle); 

Questo snippet legge da stderr. Rimuovi la pipe da leggere dallo stdout.

3

Non è possibile visualizzare il risultato dell'eco sulla console perché non è mai andato alla console. Aprendo il processo in modalità lettura, il suo STDOUT era collegato all'handle del file del processo aperto. L'unico modo in cui l'output verrebbe alla console sarebbe se si leggesse da quell'handle di file, quindi l'eco.

Il flusso, in altre parole, è questo.

  • b.php inizia in esecuzione - il suo STDIN e STDOPUT collegato alla console, come al solito
  • chiama popen in modalità lettura e memorizza la risorsa flusso in $ h
  • questo provoca a.php per iniziare a correre , con il suo STDOUT collegato al descrittore di file in $ h, e il suo STDIN non collegato a nulla
  • ciò significa, come puoi vedere, che a.php non ha accesso diretto alla console da cui è stato avviato b.php
  • a.php scrive il suo output su quel flusso e termina quindi con
  • b.php non fa mai nulla con lo stream in $ h, lo chiude semplicemente, quindi l'output di a.php viene perso.

Spero che questo spieghi cosa sta succedendo qui. Se volete vedere l'uscita del a.php sulla console, quindi b.php ha bisogno di leggerlo dal flusso di $ h, then echo esso, dal momento che solo b.php ha accesso alla console.

In alternativa, se si utilizza system() anziché popen(), l'output verrà emesso automaticamente sulla console dello script chiamante, poiché usando system() si passa lo STDIN e lo STOUT dello script principale al programma o allo script che si chiamata.

Problemi correlati