假设一个页面需要很长时间才能生成,例如某个大型报表,并且用户关闭浏览器,或者他们按下刷新,PHP引擎是否会停止从原始请求生成页面?
如果没有,那么可以做些什么来应对用户刷新页面,从而导致生成昂贵的报告。
我试过这个,似乎它不会停止对数据库的任何运行查询。但这可能是一个引擎问题,而不是PHP。
额外信息:
IIS7
MS SQL Server通过ODBC
答案 0 :(得分:3)
当您向服务器发送请求时,它会在服务器上执行而不与浏览器进行任何通信,直到将信息发送回浏览器。当PHP尝试将数据发送回浏览器时,它将失败,因此脚本将退出。
但是,如果在发送任何标头之前执行了大量代码,则会继续执行,直到发送标头并收到失败的响应为止。
答案 1 :(得分:2)
PHP知道连接在尝试输出某些数据时已关闭(并且失败)。 echo
,print
,flush
等。除此之外,不,它没有;其他一切都发生在服务器端。
答案 2 :(得分:2)
一旦提出请求(或在您的情况下,正在进行中),几乎没有传递有关浏览器状态的信息
要知道用户是否仍然连接到您的网站,您需要实施一个长轮询/彗星或者一个网络套接字。
或者 - 您可能希望运行通过ajax调用启动的长查询 - 同时保持主浏览器的respsonsive(不是白色屏幕)。这允许您在长查询期间使用Javascript事件onbeforeunload()检测浏览器是否已关闭,以通知您的后端用户已离开。 (我不确定如何从另一个HTTP请求中截取正在进行的查询)
答案 3 :(得分:1)
PHP有两个函数来控制它。 set_time_limit(num)能够在页面执行“死亡”之前增加限制。如果不扩展该限制,则运行“太长”的页面将会死亡。对于漫长的过程不利。此外,您需要 ignore_user_abort(TRUE),以便服务器在服务器检测到客户端已关闭该页面时不会关闭PHP进程。
如果您正在编写使用大量内存且运行数小时的内容,则可能还需要检查内存泄漏。
答案 4 :(得分:0)
当您向服务器发送请求时,服务器将消失并执行相应的操作。 IIS / SQL Server不知道浏览器是否已关闭(并且IIS / SQL Server无法理解这一点),因此它将执行命令(正如PHP引擎所说,直到它完成或直到引擎杀死任何交易)。由于您的报告可能是动态的,因此IIS不会缓存页面请求,但SQL Server可以缓存以前运行的最后一个查询,因此您将从数据库后端看到一些性能提升。