如何将数据刷新到浏览器但继续执行
我有一个和一个相应的.我想刷新一部分数据并继续执行其余数据。使用没有帮助。此外,如果可能的话,休息需要发生,而不在浏览器中显示加载。ob_start()
ob_flush()
ob_flush()
编辑:
我不想使用ajax
我有一个和一个相应的.我想刷新一部分数据并继续执行其余数据。使用没有帮助。此外,如果可能的话,休息需要发生,而不在浏览器中显示加载。ob_start()
ob_flush()
ob_flush()
编辑:
我不想使用ajax
我过去曾这样做过,这就是我如何解决它:
ob_start();
/*
* Generate your output here
*/
// Ignore connection-closing by the client/user
ignore_user_abort(true);
// Set your timelimit to a length long enough for your script to run,
// but not so long it will bog down your server in case multiple versions run
// or this script get's in an endless loop.
if (
!ini_get('safe_mode')
&& strpos(ini_get('disable_functions'), 'set_time_limit') === FALSE
){
set_time_limit(60);
}
// Get your output and send it to the client
$content = ob_get_contents(); // Get the content of the output buffer
ob_end_clean(); // Close current output buffer
$len = strlen($content); // Get the length
header('Connection: close'); // Tell the client to close connection
header("Content-Length: $len"); // Close connection after $len characters
echo $content; // Output content
flush(); // Force php-output-cache to flush to browser.
// See caveats below.
// Optional: kill all other output buffering
while (ob_get_level() > 0) {
ob_end_clean();
}
正如我之前在几条评论中所说,您应该注意gzi压缩您的内容,因为这会改变您的内容的长度,但不会更改有关它的标题。它还可以缓冲您的输出,因此它不会立即发送到客户端。
您可以尝试让 apache 知道不要使用 .但是,如果您使用重写规则转到页面,这将不起作用,因为这样它也会修改这些环境变量。至少,它为我做到了。apache_setenv('no-gzip', '1');
请参阅手册中有关将内容刷新给用户的更多注意事项。
ob_flush
写入缓冲区。换句话说,告诉PHP给Apache(或nginx/lighttpd/whatever)输出,然后让PHP忘记它。一旦Apache有了输出,它就会做任何它想做的事情。(换句话说,在你无法控制它是否立即写入浏览器之后)。ob_flush
ob_flush
所以,简短的回答:没有保证的方法可以做到这一点。
只是一个猜测,你可能正在寻找AJAX。每当人们试图像您一样加载页面内容时进行操作时,AJAX几乎总是正确的路径。
如果要在后台继续执行任务,可以使用 ,如此处所述,但是,这通常不是最佳方法。你基本上失去了对该线程的控制,在我看来,Web服务器线程不是繁重处理所属的地方。ignore_user_abort
我会尝试从面向网络的东西中提取它。这可能意味着一个cron条目或只是从PHP内部生成一个后台进程(一个虽然从脚本执行内部开始的进程不会随脚本一起死亡,并且脚本不会等到它完成然后死亡)。
如果你走这条路,这意味着你甚至可以在必要时建立某种状态系统。然后,您可以监视执行并定期向用户提供有关进度的更新。(从技术上讲,您也可以使用-ed脚本制作状态系统,但对我来说似乎并不那么干净。ignore_user_abort