我只是一个业余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();
它确实可以在没有任何服务器配置的情况下工作,非常适合我的需求(临时)。但我会看看这里张贴的建议。