2016-05-01 105 views
0

在Windows上,我使用PHP来执行gulp命令。使用PHP exec()实时输出到文件?

像这样:

<?php 

    set_time_limit(0); 

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

这工作,但我只能把它完成后命令,这需要大约30秒的成绩。

我想结果写入文件,正在运行一段时间,所以我可以轮询使用Ajax的间隔进度。

在正常的命令提示符我可以做

gulp > results.txt 2>&1 

和命令运行时的文本文件被填满。我已经尝试shell_exec(),system()和passthru(),但我不能从PHP内部获得此工作。

任何想法的?

+0

也许[POPEN(http://php.net/manual/en/function.popen.php)会有所帮助。 – segFault

回答

0

为什么不按照您提出的方式致电exec()

<?php 

    set_time_limit(0); 

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

我当然试过这个,但是这个命令似乎立即停止,并且什么都不做。不知道为什么。 – Dylan

0

使用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

我遇到过这个例子,但并不能真正理解它发生了什么。这在哪里写结果?如何在我的例子中使用它? – Dylan

+0

'$ cwd'应该设置为''/ projectpath'','$ cmd ='gulp';',然后用你想要stdout和stderr的文件名来替换'stdout'和'stderr'。 – phihag