php 实时输出system()
php output system() in real time
我正在尝试进行系统调用并将每一行实时发送到浏览器
echo('<pre>');
system('ping -c 10 www.google.com');
echo('</pre>);
当我从命令行调用它时它起作用了(ping 的每一行一次输出一个)。但是,当我尝试使用浏览器(firefox 或 chrome)打开时它不起作用。
我几乎可以肯定这与浏览器强制执行的输出缓冲有关。他们不会显示新数据,除非它高于某个阈值。这类问题的解决方案通常涉及输出一堆空白字符,即 str_repeat(' ',1024*64)
。你能想出什么办法让浏览器实时显示输出吗?
你不能这样做。
您的 php 请求是 运行 一次并返回一个响应。
系统功能的结果也会在您的命令执行结束时显示。您在命令行中看到的只是命令本身的日志,而不是您的 php 代码。
我建议使用一种长轮询技术或 soquet-io 与您的服务器建立持续/实时通信。
<?php
// WARNING : this define depends from web browser
// Google Chrome => 1024
// Mozilla Firefox => 2048 (not sure)
// Internet Explorer => Much more ... but works :)
define ("NUMBER_BYTE_PADDERS", "1024" );
ob_implicit_flush(1);
print padder ("first message") . "<br />";
sleep (5);
print padder ("second message after 5 seconds") . "<br />";
sleep (10);
print padder ("third message after 15 seconds") . "<br />";
function padder ($msg) {
for ($i=0 ; $i < NUMBER_BYTE_PADDERS ; $i++) {
$msg .= ' ';
}
return $msg;
}
?>
我正在尝试进行系统调用并将每一行实时发送到浏览器
echo('<pre>');
system('ping -c 10 www.google.com');
echo('</pre>);
当我从命令行调用它时它起作用了(ping 的每一行一次输出一个)。但是,当我尝试使用浏览器(firefox 或 chrome)打开时它不起作用。
我几乎可以肯定这与浏览器强制执行的输出缓冲有关。他们不会显示新数据,除非它高于某个阈值。这类问题的解决方案通常涉及输出一堆空白字符,即 str_repeat(' ',1024*64)
。你能想出什么办法让浏览器实时显示输出吗?
你不能这样做。 您的 php 请求是 运行 一次并返回一个响应。
系统功能的结果也会在您的命令执行结束时显示。您在命令行中看到的只是命令本身的日志,而不是您的 php 代码。
我建议使用一种长轮询技术或 soquet-io 与您的服务器建立持续/实时通信。
<?php
// WARNING : this define depends from web browser
// Google Chrome => 1024
// Mozilla Firefox => 2048 (not sure)
// Internet Explorer => Much more ... but works :)
define ("NUMBER_BYTE_PADDERS", "1024" );
ob_implicit_flush(1);
print padder ("first message") . "<br />";
sleep (5);
print padder ("second message after 5 seconds") . "<br />";
sleep (10);
print padder ("third message after 15 seconds") . "<br />";
function padder ($msg) {
for ($i=0 ; $i < NUMBER_BYTE_PADDERS ; $i++) {
$msg .= ' ';
}
return $msg;
}
?>