$ _SESSION数组未在模型中更新(mvc)

时间:2014-07-07 21:39:27

标签: php jquery session zend-framework

我有一个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%肯定。

我将不胜感激任何帮助..

谢谢

1 个答案:

答案 0 :(得分:1)

根据php.net$_SESSION变量仅在脚本完成后更新:

  

会话数据通常在脚本终止后存储,无需调用session_write_close(),但由于会话数据被锁定以防止并发写入,因此任何时候只有一个脚本可以在会话上运行。将框架集与会话一起使用时,由于此锁定,您将体验到逐个加载的框架。只要对会话变量进行了所有更改,就可以通过结束会话来减少加载所有帧所需的时间。

您需要使用$_SESSION之外的其他内容来持久存储数据,因为我不相信您可以在单个脚本中多次保存$_SESSION /请求。一种可能的解决方案是将数据保存在数据库中。您需要确定要使用的持久存储方法。

编辑:

我可能说得太早了。也许您可以使用session_write_close(),然后在每次分配到session_start()变量后使用$_SESSION进行跟进。