【发布时间】:2014-10-28 02:28:38
【问题描述】:
我的 php 脚本可能需要很长时间(最多 3-5 分钟),所以我想通知用户进展如何。
我阅读了这个question 并决定使用会话来保存有关工作进度的信息。
所以,我在 php 中有以下指令:
public function longScript()
{
$generatingProgressSession = new Zend_Session_Namespace('generating_progress');
$generatingProgressSession->unsetAll();
....
$generatingProgressSession->total = $productsNumber;
...
$processedProducts = 0;
foreach($models as $model){
//Do some processing
$processedProducts++;
$generatingProgressSession->processed = $processedProducts;
}
}
我有一个简单的脚本,用于从会话中获取数据(总数和已处理项目的数量),它们以 json 格式返回。
所以,这里是调用长脚本的js代码:
$.ajax({
url: 'pathToLongScript',
data: {fileId: fileId, format: 'json'},
dataType: 'json',
success: function(data){
if(data.success){
if(typeof successCallback == "function")
successCallback(data);
}
}
});
//Start checking progress functionality
var checkingGenerationProgress = setInterval(function(){
$.ajax({
url: 'pathToCheckingStatusFunction',
data: {format: 'json'},
success: function(data){
console.log("Processed "+data.processed+" items of "+data.total);
if(data.processed == data.total){
clearInterval(checkingGenerationProgress);
}
}
});
}, 10000)
因此,长脚本是通过 ajax 调用的。然后在 10 秒后调用一次检查脚本,在 20 秒后 - 秒后等。
问题是在主长脚本完成之前,对检查脚本的请求都没有完成。那么,这意味着什么?那个长脚本消耗太多资源,服务器无法处理任何其他请求?还是我有一些错误的 ajax 参数?
看图:
-----------UPD
这是一个检查状态的php函数:
public function checkGenerationProgressAction()
{
$generatingProgressSession = new Zend_Session_Namespace('generating_progress');
$this->view->total = $generatingProgressSession->total;
$this->view->processed = $generatingProgressSession->processed;
}
我这里用的是ZF1 ActionContext helper,所以这个函数的结果是json object {'total':'somevalue','processed':'another value'}
【问题讨论】:
-
我想了解为什么这些检查进度的请求在对长 php 脚本的请求完成之前无法完成。