我有一个while循环从数据库表中选择行,它在while循环中打印这些数据:
print $result2["forename"].' '. $result2["surname"].' ('.$result2["email"].')<br><hr />';
但是它需要很长时间才能加载页面然后一次显示大量行。当它从数据库加载数据时,如何让它逐行显示?
PHP 在服务器上运行并逐行输出数据,但在脚本完成处理之前它不会向用户发送任何内容。
如果您遇到性能问题,您可能会考虑尝试调整查询,或限制返回的记录数。
一个常见的技巧是使用分页来选择一堆行,快速显示它们,然后在需要时重新查询数据库以获取下一行。通常,这允许更小的占用空间,用户可以选择是否要实际查看其他结果。
要在整个 PHP 脚本执行之前发送缓冲数据,您可以使用flush()函数。但请仔细阅读文档,因为它可能不适用于所有环境。
工作示例:
<?php
header("Content-type: text/html; charset=utf-8");
for ($i = 1; $i <= 10; $i++) {
print ($i . '<br>');
flush();
ob_flush();
sleep(1);
}
之前发送标头似乎很重要。在我的本地主机上没有它就无法工作。flush()
此外,ob_flush()
根据flush()
文档使用两者也是一个好主意。
如果还是不行
PHP 文档说:
Apache 的服务器模块(如 mod_gzip)可能会自己进行缓冲,这将导致 flush() 不会导致数据立即发送到客户端。
试试喜欢
page1.php
<script>
var page=1;
var doRequest = function() {
$.ajax({
type:"POST",
url:"page2.php",
data:{page:page},
success: function(response) {
$("#container").append(response);
page++;
doRequest();
}
});
}
doRequest();
</script>
<div id='container'>
</div>
page2.php
<?php
$page = $_POST["page"];
$rowsPerRequest = 20;
$offset = ($page - 1) * $rowsPerRequest;
$sql = "SELECT * FROM table LIMIT $offset, $rowsPerRequest";
....
....
print $result2["forename"].' '. $result2["surname"].' ('.$result2["email"].')<br><hr />';
?>