我有一个Model Class,它有一个以文件名数组作为参数的函数。它对文件运行foreach
并处理它们。
foreach
的第一行是$_SESSION["file_processing"] = $file;
我有一个定期调用的js函数并获取$_SESSION["file_processing"]
并将其输出到div中。这就是我计划向用户显示当前正在处理的文件的方式。
我的js功能:
function call_files_all_together() {
alert("You will start getting emails for all files. Thanks !");
var log = setInterval(function(){ProcessingFilesLog()},5000);
$("#ajax-loader-gif").html("<img src = \"/images/ajax-loader.gif\" />");
$.ajax({
type : 'POST',
url : '/query-set/create-all-files/'
}).done(function(data) {
alert(data);
clearInterval(log);
$("#ajax-loader-gif").empty();
});
}
function ProcessingFilesLog() {
console.log("get log called");
$.ajax({
type : 'POST',
url : '/query-set/file-log'
}).done(function(data){
console.log(data);
if(data != "")
$("#files-log").append(data + "<br/>");
else
console.log("empty data");
});
}
我的控制器功能如下:
public function createAllFilesAction() {
$this->_helper->viewRenderer->setNoRender();
$this->_helper->layout->disableLayout();
$qs = new Model_QuerySet;
$qs->createAllFiles();
echo "Files Sent!";
// unset($_SESSION["file_processing"]);
}
public function FileLogAction() {
$this->_helper->viewRenderer->setNoRender();
$this->_helper->layout->disableLayout();
$log = $_SESSION["file_processing"] ;
var_dump($_SESSION);
echo $log;
}
我的模型功能:
public function createAllFiles() { #all
$db = Zend_Db_Table::getDefaultAdapter();
$ex = new Model_ExcelHandling;
foreach ($this->filename as $name=>$data){
echo $name.PHP_EOL;
$_SESSION["file_processing"] = $name;
//Do my things here.
}
}
我第一次运行脚本时,在$_SESSION
数组中没有看到关键字“file_processing”。第二次运行它时,我看到$_SESSION["file_processing"]
保存了先前执行时处理的最后一个文件的值。
我似乎$_SESSION
只有在循环结束后才会更新,或者在这些行之后,我不是100%肯定。
我将不胜感激任何帮助..
谢谢
答案 0 :(得分:1)
根据php.net,$_SESSION
变量仅在脚本完成后更新:
会话数据通常在脚本终止后存储,无需调用session_write_close(),但由于会话数据被锁定以防止并发写入,因此任何时候只有一个脚本可以在会话上运行。将框架集与会话一起使用时,由于此锁定,您将体验到逐个加载的框架。只要对会话变量进行了所有更改,就可以通过结束会话来减少加载所有帧所需的时间。
您需要使用 $_SESSION
之外的其他内容来持久存储数据,因为我不相信您可以在单个脚本中多次保存$_SESSION
/请求。一种可能的解决方案是将数据保存在数据库中。您需要确定要使用的持久存储方法。
编辑:
我可能说得太早了。也许您可以使用session_write_close()
,然后在每次分配到session_start()
变量后使用$_SESSION
进行跟进。