【问题标题】:$_SESSION array not updating in Model (mvc)$_SESSION 数组未在模型中更新(mvc)
【发布时间】:2014-07-07 21:39:27
【问题描述】:

我有一个模型类,它有一个以文件名数组作为参数的函数。它在文件上运行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% 确定。

我会很感激任何帮助..

谢谢

【问题讨论】:

  • 你在哪里调用那个模型函数,如果你也给我们看看会更好。
  • 嘿 Adeel,还添加了 js 和控制器功能 .. :)
  • 你应该展示的是执行操作的模型类,而不是js代码。
  • 哈哈,也做到了..谢谢

标签: php jquery session zend-framework


【解决方案1】:

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

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

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

编辑:

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

【讨论】:

  • Wio .. 你是对的。添加 session_write_close();session_start();更新后在我的模型类中使其工作。但我想知道是否有更好的方法来尝试实现我想要做的事情,可能不使用 Sessions ? .. 再次感谢 Wio..
  • 也许你要找的是memcache
猜你喜欢
  • 2012-08-04
  • 2020-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-29
相关资源
最近更新 更多