【发布时间】:2012-01-12 07:50:11
【问题描述】:
我有这个 shell 程序,我想通过 php 执行。问题是它可能需要很长时间,因此我需要它实时更新到用户的浏览器。
我读到我可能需要使用 popen() 来做到这一点,但我有点(好吧,我真的是 :P)一个 PHP 菜鸟,不知道我是如何做到的。
不胜感激!
【问题讨论】:
标签: php popen shell-exec
我有这个 shell 程序,我想通过 php 执行。问题是它可能需要很长时间,因此我需要它实时更新到用户的浏览器。
我读到我可能需要使用 popen() 来做到这一点,但我有点(好吧,我真的是 :P)一个 PHP 菜鸟,不知道我是如何做到的。
不胜感激!
【问题讨论】:
标签: php popen shell-exec
if( ($fp = popen("your command", "r")) ) {
while( !feof($fp) ){
echo fread($fp, 1024);
flush(); // you have to flush buffer
}
fclose($fp);
}
【讨论】:
有两种可能的行为:
非阻塞,你需要在刷新之间做其他事情(@GameBit 显示如何做)。
使用 Block,您等待调用的命令完成,在这种情况下查看 passthru function
【讨论】:
试试这个代码(在 Windows 机器 + wamp 服务器上测试)
header('Content-Encoding: none;');
set_time_limit(0);
$handle = popen("<<< Your Shell Command >>>", "r");
if (ob_get_level() == 0)
ob_start();
while(!feof($handle)) {
$buffer = fgets($handle);
$buffer = trim(htmlspecialchars($buffer));
echo $buffer . "<br />";
echo str_pad('', 4096);
ob_flush();
flush();
sleep(1);
}
pclose($handle);
ob_end_flush();
【讨论】:
有一个肮脏的简单选项
`yourcommand 1>&2`;
将标准输出重定向到标准错误。
【讨论】:
我使用了这个解决方案。对我来说效果很好。
$commandString = "myexe";
# Uncomment this line if you want to execute the command in background on Windows
# $commandString = "start /b $commandString";
$exec = popen($commandString, "r");
# echo "Async Code Test";
while($output = fgets($exec, 2048))
{
echo "$output <br>\n";
ob_flush();
flush();
}
pclose($exec);
【讨论】: