2016-05-01 4 views
0

Sous Windows, j'utilise PHP pour exécuter une commande gulp.Sortie en direct dans un fichier avec PHP exec()?

Comme ceci:

<?php 

    set_time_limit(0); 

    exec("cd /projectpath"); 
    $results = exec("gulp"); 
?> 

Cela fonctionne, mais je ne peux obtenir les résultats de la commande après qu'il ait fini, qui prend environ 30 secondes.

Je voudrais écrire les résultats dans un fichier, alors qu'il est en cours d'exécution, donc je peux interroger les progrès dans un intervalle en utilisant Ajax.

Dans une invite de commande normale que je peux faire

gulp > results.txt 2>&1 

et le fichier texte est rempli alors que la commande est en cours d'exécution.

J'ai déjà essayé shell_exec(), system() et passthru() aussi, mais je n'arrive pas à le faire fonctionner depuis PHP.

Une idée est?

+0

Peut-être [popen] (http://php.net/manual/en/function.popen.php) sera utile. – segFault

Répondre

0

Pourquoi ne pas simplement appeler exec() comme vous l'avez proposé?

<?php 

    set_time_limit(0); 

    exec("cd /projectpath"); 
    $results = exec("gulp > results.txt 2>&1"); 
?> 
+0

J'ai essayé cela bien sûr, mais la commande semble s'arrêter immédiatement et ne fait rien. Aucune idée pourquoi. – Dylan

0

Utilisation proc_open:

<?php 
$cmd = 'for i in $(seq 20); do sleep 1; echo $i; done'; 
$cwd = '/'; 
$descriptors = array(
    0 => array('pipe', 'r'), 
    1 => array('file', 'stdout', 'w'), 
    2 => array('file', 'stderr', 'w'), 
); 

$handle = proc_open($cmd, $descriptors, $pipes, $cwd); 
if (!$handle) { 
    echo 'failed to run command'; 
} else { 
    proc_close($handle); // wait for command to finish (optional) 
} 
+0

Je suis tombé sur cet exemple, mais je ne comprenais pas vraiment ce qui se passait. Où est-ce que cela écrit les résultats? Comment l'utiliser dans mon exemple? – Dylan

+0

'$ cwd' devrait être défini sur' '/ projectpath'', '$ cmd =' gulp ';', et remplacer ensuite 'stdout' et' stderr' par les noms de fichiers où vous voulez avoir stdout et stderr. – phihag