【问题标题】:Periodically output to browser on long operation长时间运行时定期输出到浏览器
【发布时间】:2012-01-06 01:14:20
【问题描述】:

我正在使用LOAD DATA INFILE 导入11M 记录,然后脚本继续进行其他操作。导入需要 10 分钟,此时浏览器已放弃(3 分钟后),我看不到后续操作的进度。有没有办法在这个耗时的查询运行时定期向浏览器输出一些东西。 Phpmyadmin 似乎在做这样的事情,并且浏览器不会超时。

【问题讨论】:

    标签: php mysql timeout load-data-infile


    【解决方案1】:

    查看 flush() (http://php.net/manual/en/function.flush.php) 或 ob_flush() (http://www.php.net/manual/en/function.ob-flush.php)。

    基本上,您通常会生成输出(在这种情况下为当前状态),然后强制服务器输出当前缓冲区中的内容。

    如果您的操作需要 10 分钟,您可能需要使用 set_time_limit($seconds) (http://php.net/manual/en/function.set-time-limit.php),请注意不要将其设置为很大,以防页面挂起。

    如果您想每 10%(1 分钟)输出一次状态,您可以在每次刷新刷新后将超时重置为 2 分钟。这样,如果超出预期的运行时间,您的脚本将超时。

    【讨论】:

    • 谢谢,但问题是 PHP 在完成 mysql 查询之前不会继续执行下一个函数。我需要它在执行查询时向浏览器输出一些内容。
    • 我回答的第二部分回答了你的问题,你可以设置大于10分钟的超时时间。
    • 是的,我的 php 超时 20 分钟,PHP 没有超时。这是浏览器在 3 分钟后停止等待。一旦发生这种情况,我就不会再对浏览器进行任何更新了。我还有其他长脚本在循环中。有了这些,我可以定期向浏览器输出一些东西以保持它“感兴趣”
    • 看看在你的标题中设置keep-alive参数。说了这么多,我真的认为这一切都不是要走的路。对于如此长的操作,您应该在服务器的后台进程中运行它,然后在您的页面上使用 javascript 来轮询您的工作状态。我不使用任何像 phpmyadmin 这样的 Web 界面,但如果他们不在后台运行它们并且只是轮询状态,我会感到非常惊讶。我认为这是一个供一个人或极少数人使用的工具,因此您可能可以通过这种方式获得,但它绝不是可扩展的。
    • 是的,这是个好主意。我可以让 javascript 来轮询某些东西以保持浏览器处于活动状态,这样我就会看到其余的输出。这是一个非常复杂的数据库转换脚本,有很多阶段。最终它将在没有输出的 cron 作业上运行,但现在我们需要在输出进行时查看输出。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多