2011-07-21 52 views
0

我有一个模板做操作的船载,我预计需要30-45分钟才能完成它的处理......我已经在我的设置应用程序和会话瓦尔超时一些成功@ 2小时。并且我已经将我的请求超时设置为9999(应该是2.77小时)...的ColdFusion /浏览器超时

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

任何人都可以提出一个可靠的方法来保持这个过程中去 - 直到它完成或我的天文发生超时?此外,有什么方法可以将反馈推送到浏览器,以便它不超时......我尝试过cfflush,但似乎没有这样做。

+0

问题可能与任务本身有关。尝试让应用程序在没有运行任务的情况下运行,并查看是否会在20分钟后停止相同的白屏和/或CF服务器。 –

+0

我不确定我是否明白你的意思......我并不怀疑应用程序变量是否持续分配时间......并且任务正在徘徊......因为我可以看到更新每个记录的db中的时间。 ...它只是在一个时间点停止,这是我设置的任何超时之前的方式... – jpmyob

回答

2

你可以使用cfthread在一个单独的线程你在浏览器访问网页上运行的过程,然后,你可以使用JavaScript来定期轮询系统,以检查其状态。例如,在cfthread的长时间运行过程中,在您完成工作时,您可以设置一个应用程序变量,指示进程仍在运行,并且在运行过程中有多远,并在浏览器中检索并报告这些进程。完成后,您可以清除变量,或设置完整的标志等,并且浏览器报告页面将能够指示它已完成。

+0

肖恩 - 这听起来像是一个胜利者。我是试一试 - 会让你知道。 – jpmyob

0

如果你有一个进程正在运行那么久,那么你就需要将它作为一个计划任务运行。

我想你的浏览器是一个死亡。

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

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

+0

好 - 我已将requesttimeout设置为9999 ...我想要会话 - 因为我做了查询并且stor在一个会议 - 查询反对 - 因为我不想继续打DB ...足以说我需要内存变量的持久性... – jpmyob

0

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

该数据库应该能够处理繁重的工作。我猜测你在应用程序中进行的大量处理可以重新考虑直接发生在数据库上,并为你节省大量时间。

无论如何,你应该考虑像CFTHREAD肖恩提到,计划任务或排队系统来处理一个漫长的过程是这样的。用户很可能不希望在看到下一个屏幕之前等待该过程结束。如果他们被告知前面的过程是漫长的,只要他们可以继续执行其他任务,他们就会应对等待。

+0

富 - 通常我会同意你 - 但是这对我来说是唯一的,没有其他用户。而工作中的数据不是数据库 - 因为它需要解析和写入文件 - 所以存在大量的文件系统命中。数据库方面只是作为一个日志。在那条路上 - 我想我可以缓存qry - 但是对于我来说,缓存会比缓存更容易 - 或者在我写代码的那一刻看起来就像它 - 但是内存在那里应该没有区别缓存的查询和会话结果集.... thx。我正在寻找线程 - 这似乎是要走的路。 – jpmyob

1

我强烈建议重构代码以使用简单的消息/队列系统。实施(或者从头开始编写一个简单的程序)并不需要30分钟,并且在解决这个问题上会提供很多好处。

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

这样做,这样有字面上没有限制多少处理,你可以做,因为你将添加并根据需要从栈中移走。

如果您提供更多背景信息,我很乐意帮助您找出合理的分部来实现这一目标。

0

我有同样的问题。通常,在服务器没有发送任何内容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会定期更新下载进度。

解决!