简单的问题,但我似乎无法找到答案。
我的 php 代码需要很长时间才能处理,因为我正在从大型数据库生成报告。我编写了一个 html 表以在网页中显示结果,但是在我的 php 代码完成之前页面加载(并被发送到客户端),因为所有表值都是空的。我在 phpMyAdmin 上运行查询,它可以工作,但只需要很长时间。想法?除了在网页中查看报告之外,还有其他方法可以以表格格式显示报告吗?我可以让网页等到代码完成吗?
有几种方法
一个正在使用
ob_start();
// processing
ob_flush();
flush();
接下来是添加分页,也就是限制结果大小。
SELECT * FROM table LIMIT 0,10
SELECT * FROM table LIMIT 10,10
SELECT * FROM table LIMIT 20,10
当然这一切都取决于你的代码,没有看到你的代码,只能猜测可能是什么原因
我可以让网页等到代码完成吗?
编写实现异步数据库调用的 PHP 代码真的非常困难——如果 PHP 脚本在 MySQL 脚本之前完成,则需要这样做。只需更改去掉 PHP 代码中的所有异步处理程序,并使 MySQL 调用阻塞,它不会在查询完成之前退出 - 但我非常怀疑这就是你的代码真正在做什么。
但是页面加载(并被发送给客户端)
这也很困惑——如果你正在生成HTML,那么在 HTML 发送到客户端之后页面会被加载——而不是之前。
简单的问题
不,不是——它很困惑!
审慎之道
至少我推荐的一种正确方法是,根据用户的请求,将作业添加到由后台进程处理的队列中,例如,从 cron 运行的 PHP 命令行脚本工作。在此过程中,您可以通过网页上的 AJAX 调用定期向服务器请求作业状态,显示进度(如果可以),并在作业完成后向用户显示结果。由于命令行 PHP 脚本没有时间限制,因此您不必担心超时。
另一种方式是在 37signals 的 Highrise 中实现的方式——他们接受添加工作的请求,但显示一个页面,上面写着“它准备好时就准备好了”,当它准备好时,他们向用户发送一封电子邮件说“这是你的文件,来这里下载。”
快速修复
回答“我可以让网页等到代码完成吗?”的问题。– 有一个set_time_limit()
功能可以完全满足您的需求。