用PHP实时输出运行进程
我正试图在网页上运行一个进程,以实时返回它的输出。 例如,如果我运行'ping'进程,它应该每次更新我的页面时它会返回一个新行(现在,当我使用exec(command,output)时,我不得不使用-c选项并等待进程结束以查看输出在我的网页上)。 是否有可能在PHP中做到这一点?
我也想知道当有人离开这个页面时,什么是正确的方法来杀死这种过程。 在“ping”进程的情况下,我仍然能够看到进程在系统监视器中运行(有意义)。
这对我有效:
$cmd = "ping 127.0.0.1";
$descriptorspec = array(
0 => array("pipe", "r"), // stdin is a pipe that the child will read from
1 => array("pipe", "w"), // stdout is a pipe that the child will write to
2 => array("pipe", "w") // stderr is a pipe that the child will write to
);
flush();
$process = proc_open($cmd, $descriptorspec, $pipes, realpath('./'), array());
echo "<pre>";
if (is_resource($process)) {
while ($s = fgets($pipes[1])) {
print $s;
flush();
}
}
echo "</pre>";
这是显示shell命令的实时输出的好方法:
<?php
header("Content-type: text/plain");
// tell php to automatically flush after every output
// including lines of output produced by shell commands
disable_ob();
$command = 'rsync -avz /your/directory1 /your/directory2';
system($command);
您将需要此功能来防止输出缓冲:
function disable_ob() {
// Turn off output buffering
ini_set('output_buffering', 'off');
// Turn off PHP output compression
ini_set('zlib.output_compression', false);
// Implicitly flush the buffer(s)
ini_set('implicit_flush', true);
ob_implicit_flush(true);
// Clear, and turn off output buffering
while (ob_get_level() > 0) {
// Get the curent level
$level = ob_get_level();
// End the buffering
ob_end_clean();
// If the current level has not changed, abort
if (ob_get_level() == $level) break;
}
// Disable apache output buffering/compression
if (function_exists('apache_setenv')) {
apache_setenv('no-gzip', '1');
apache_setenv('dont-vary', '1');
}
}
它不适用于我尝试过的每一个服务器上,但我希望我可以提供关于在你的php配置中寻找什么的建议,以确定你是否应该让自己的头发出来试图让这种行为起作用在你的服务器上! 其他人知道吗?
以下是纯PHP中的一个虚拟示例:
<?php
header("Content-type: text/plain");
disable_ob();
for($i=0;$i<10;$i++)
{
echo $i . "n";
usleep(300000);
}
我希望这可以帮助那些在这里搜索的人。
试试这个(在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();
链接地址: http://www.djcxy.com/p/54877.html