【问题标题】:coldfusion / browser timeout冷融合/浏览器超时
【发布时间】:2011-07-21 17:42:53
【问题描述】:

我有一个模板进行大量操作,我预计它需要 30-45 分钟才能完成它的处理...我在将我的应用程序和会话变量设置为超时 @ 2 小时方面取得了一些成功。我已将请求超时设置为 9999(应该是 2.77 小时)...

但是 - 似乎有一个神奇的阈值 - 在 20 分钟左右的某个地方,我的浏览器进入白屏(无输出),看起来好像 CF 引擎也停止了我的任务......

谁能建议一个可靠的方法来保持这个过程 - 直到它完成或我的天文超时发生?另外,有什么方法可以将反馈推送到浏览器,这样它就不会超时......我试过cfflush,但似乎没有。

【问题讨论】:

  • 问题可能出在任务本身。尝试让应用程序在不运行任务的情况下运行,看看是否会在 20 分钟后出现相同的白屏和/或 CF 服务器停止。
  • 我不确定我明白你在说什么......我不“怀疑”应用程序变量会在分配的时间内持续存在......并且任务正在进行中。 ..我可以在我的数据库中看到每条记录的更新时间。 ...它只是在我设置的任何超时之前的时间点停止...

标签: coldfusion


【解决方案1】:

您可以使用 cfthread 在单独的线程中运行该进程,然后在您正在浏览器中访问的页面上,您可以使用 javascript 定期轮询系统以检查其状态。例如,在 cfthread 中长时间运行的进程中,当您完成时,您可以设置一个应用程序变量来指示该进程仍在运行以及它的运行距离,并在浏览器中检索和报告这些变量。完成后,您可以清除变量,或设置完成标志等,您的浏览器报告页面将能够指示它已完成。

【讨论】:

  • 肖恩 - 这听起来像是赢家。我正在尝试 - 会告诉你的。
【解决方案2】:

我强烈建议重构代码以使用简单的消息传递/队列系统。只需 30 分钟即可实现(或从头开始编写一个简单的!),并且除了解决这个问题之外,还可以提供很多好处。

例如,它不是整个操作的通过/失败。如果您在 1.5 小时标记处遇到障碍,您将不会重新执行整个过程,只会重新执行失败的部分。

这样做实际上对您可以执行的处理量没有限制,因为您将根据需要从堆栈中添加和删除。

如果您提供更多背景知识,我很乐意帮助您找出逻辑划分以使其成为可能。

【讨论】:

    【解决方案3】:

    如果您有一个进程运行了这么长时间,那么您会希望将其作为计划任务运行。

    我想你的浏览器正在死去。

    您是否检查过请求是否仍在运行?

    <cfsetting requesttimeout= "3600" /> 会将页面设置为持续一小时。如果您将其作为计划任务运行,则会话超时不会影响任何事情。

    【讨论】:

    • 好吧 - 我已将 requesttimeout 设置为 9999... 我想要会话 - 因为我在会话中进行查询并存储它 - 查询 - 因为我不想继续打数据库...足以说我需要内存变量的持久性...
    【解决方案4】:

    请不要像这样在会话中存储查询。根据查询的大小和系统中的并发用户数,您可能很容易耗尽内存,从而导致一些当前请求和所有后续请求失败。

    数据库应该能够处理繁重的工作。我猜测您在应用程序中所做的大部分处理都可以重构为直接在数据库上进行,从而为您节省大量时间。

    无论如何,您应该研究像 Sean 提到的 CFTHREAD 之类的东西,计划任务或排队系统来处理这样的长流程。用户很可能不想在看到下一个屏幕之前等待进程结束。如果他们事先被告知这个过程很长,只要他们可以继续执行其他任务,他们就会忍受等待。

    【讨论】:

    • Foo - 通常我会同意你的看法 - 但是这仅适用于我,没有其他用户。并且工作的大部分不是 db - 因为它需要解析和写入文件 - 所以有一个沉重的文件系统命中。数据库端只是充当日志。在那条路径上-我想我可以缓存qry-但对我来说,fluch会话比缓存更容易-或者在我编写代码的那一刻似乎是这样-但是内存wize应该与a没有区别缓存查询和会话结果集....谢谢。 .. 我正在研究 THREAD - 这似乎是要走的路。
    【解决方案5】:

    我遇到了同样的问题。通常浏览器会在服务器没有发送任何内容 3 分钟后超时。对于这些长操作中的大多数,我能够定期输出一个点以保持浏览器处于活动状态,但是当涉及从服务器端 CSV 文件导入 20M 记录的一些极长的查询时,我不得不考虑另一种方式。

    cUrl 就是答案。

    这就是我所做的。

    <?
    function get_page($page)
    {
        $ch = curl_init($page);
        curl_setopt($ch, CURLOPT_TIMEOUT, 0);
        curl_setopt($ch, CURLOPT_NOPROGRESS,false);
        curl_setopt($ch, CURLOPT_PROGRESSFUNCTION,'progress');
        curl_setopt($ch, CURLOPT_BUFFERSIZE, 128);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_exec($ch);
    }
    
    function progress($clientp,$dltotal,$dlnow,$ultotal,$ulnow='')
    {
        echo '. ';
        flush();
        return(0);
    }
    
    
    
    get_page('http://www.example.com/my_extremely_long_operation_script.php');
    
    ?>
    

    即使服务器没有输出,curl 也会定期更新下载进度。

    解决了!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 2011-01-15
      相关资源
      最近更新 更多