我有一个模板正在进行操作,我希望它需要30-45分钟才能完成它的处理...我已经成功地将我的应用程序和会话变量设置为超时@ 2小时。我将请求超时设置为9999(应该是2.77小时)......
然而 - 似乎有一个神奇的门槛 - 大概在20分钟左右,我的浏览器进入白屏(无输出),看起来好像CF引擎也停止了我的任务... < / p>
任何人都可以建议一种可靠的方法来保持这个过程 - 直到它完成或我的天文超时发生?另外,有没有办法将反馈推送到浏览器,所以它没有超时....我已经尝试过cfflush,但似乎没有这样做。
答案 0 :(得分:2)
您可以使用cfthread在单独的线程中运行该进程,然后在您在浏览器中访问的页面上运行该进程,您可以使用javascript定期轮询系统以检查其状态。例如,在cfthread中长时间运行的进程中,当您完成操作时,您可以设置一个应用程序变量,指示进程仍在运行以及进程有多远,并在浏览器中检索和报告这些进程。完成后,您可以清除变量,或设置完整的标记等,您的浏览器报告页面将能够指示它已完成。
答案 1 :(得分:1)
我强烈建议重构代码以使用简单的消息传递/队列系统。实施(或从头开始编写一个简单的版本)只需要30分钟,并且除了解决这个问题外,还可以提供很多好处。
例如,它不是整个操作的通过/失败。如果你在1.5小时标记处遇到障碍,你将不会再次重新完成整个过程,只有部分失败。
这样做对于你可以做多少处理几乎没有限制,因为你将根据需要添加和删除堆栈。
如果您提供更多背景信息,我很乐意帮助您找出逻辑分歧,使其成为可能。
答案 2 :(得分:0)
如果您的流程运行了那么长时间,那么您将希望将其作为计划任务运行。
我想你的浏览器就是那个死的人。
您是否检查过请求是否仍在运行?
<cfsetting requesttimeout= "3600" />
会将页面设置为持续一小时。如果将其作为计划任务运行,则会话超时不应影响任何内容。
答案 3 :(得分:0)
请不要在此类会话中存储查询。根据查询的大小和系统中的并发用户数量,您可能很容易耗尽内存,导致一些当前和所有后续请求失败。
数据库应该能够处理繁重的工作。我猜测你在应用程序中进行的大部分处理都可以重新计算,直接在数据库上进行,并节省大量时间。
无论如何,你应该像Sean所提到的那样研究像CFTHREAD这样的事情,计划任务或排队系统来处理像这样的漫长过程。用户很可能不希望在看到下一个屏幕之前等待进程结束。如果他们被告知这个过程很漫长,只要他们可以继续执行其他任务,他们就会等待等待。
答案 4 :(得分: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也会定期更新下载进度。
解决!