控制php输出并在其发生时发布

  • 本文关键字:php 输出 控制 php
  • 更新时间 :
  • 英文 :


我只是一个业余php程序员!我有一个具体的要求。

我想在脚本中控制php输出行为。

我想要的是

myscript.php

echo "phase 1";// (output to browser immediately)
echo "Proceeding further....";
sleep (10);
echo "phase 2";// (output to the browser immediately)
sleep(10);
echo "phase end";

但发生的是,回声的所有输出在20秒后被转储,我的意思是完全输出,而不是按顺序。。。如何按顺序输出。。我不知道它叫什么!如果可能的话,还请举一个例子,它有助于理解

您可能想看看像Rachet这样的Websocket。对于更简单的版本,您只需使用Javascript/Ajax和PHP的组合。

编辑:最简单的方法;jQuery/PHP方式

正如评论中所要求的,这是实现异步服务器工作/反馈的一种非常简单、不安全的方式。

服务器端

//doTheWork.php
switch($_POST['step'])
{
     case 1:
         $output = shell_exec('cat text.txt'); //Do whatever you need to do here
         break;
     case 2:
         $output = shell_exec('ls');
         break;
     default:
         $output = "No or invalid step declared";
}
echo $output;

客户端

 <!doctype html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Testing live feedback</title>
        <script src="//code.jquery.com/jquery-1.11.0.min.js"></script> <!-- Include your local version of jQuery -->
        <script src="//code.jquery.com/jquery-migrate-1.2.1.min.js"></script>
    </head>
    <body>
        <div id="console">
            <h2>Output from server</h2>
            <div id="console_output">
            </div>
        </div>
        <script type="text/javascript">
            var totalSteps = 5;
            var currentStep = 0;
            var url_to_server = "http://localhost/doTheWork.php";

            function executeAndOutputData()
            {
                currentStep++;
                if(currentStep >= totalSteps) return;
                $.post(url_to_server, {step:currentStep}, function(response){
                    $("#console_output").append(response+"<br>");
                    executeAndOutputData();
                });
            }
            executeAndOutputData();
        </script>
    </body>
</html>

是的,您可以使用flush函数原生地使用PHP。

代码示例:

<?
echo "phase 1";// (output to browser immediately)
echo "Proceeding further....";
flush();
ob_implicit_flush(true);
ob_flush();
sleep (10);
echo "phase 2";// (output to the browser immediately)
sleep(10);
echo "phase end";
?>

编辑:但是,这只是为了回答你。这样的代码肯定是完全无用的,必须进行改进才能删除sleep调用。

我对Dencker的回答很满意,但我现在仍然知道了一种只使用PHP的更简单的方法。衍生自http://www.codeproject.com/Tips/680085/Real-time-Updating-of-PHP-Output

// Turn off output buffering
ini_set('output_buffering', 'off');
// Turn off PHP output compression
ini_set('zlib.output_compression', false);
//Flush (send) the output buffer and turn off output buffering
while (@ob_end_flush());
// Implicitly flush the buffer(s)
ini_set('implicit_flush', true);
ob_implicit_flush(true);
echo "Start<br />";
echo str_pad("",1024," ");
echo "<br />";
ob_flush();
flush();
sleep(5);        
echo "Program Output";
ob_flush();
flush();

它确实可以在没有任何服务器配置的情况下工作,非常适合我的需求(临时)。但我会看看这里张贴的建议。

最新更新