2

我有一个执行一些操作的循环,在循环内我有一个递增的会话计数器。这个循环完成大约需要 10-15 分钟,所以我想要某种进度条,告诉用户它通过循环走了多远。

我的 AJAX 调用假设检索我在循环内设置的会话的值,但它似乎不起作用。我得到未定义的索引错误。

我在某处读到会话一旦被一个脚本使用就会被锁定,直到它完成使用它,才解锁它。是否可以在会话上强制解锁,以便我的 ajax 脚本可以检索会话的值?

例子:

脚本 1(循环):

while(SOME CONDITION) {
    //DO ACTIONS

    $_SESSION['progress'] = $currProgress + 1;
}

脚本 2(AJAX 调用检索会话):

function getCurrentProgress() {
   $progress = isset($_SESSION['progress']) ? $_SESSION['progress'] : 0;
   echo json_encode(array('progress' => $progress));
}

上述脚本的 JS AJAX(每 30 秒调用一次)

4

1 回答 1

2

默认情况下,PHP 会话更改不会写入会话存储,直到程序结束;在程序运行时,$_SESSION就像任何其他变量一样;只能在自己的程序中访问;只有当程序结束并将会话写入磁盘时,下一个程序才能获取您对会话数据所做的更改。因此,简短的回答是,您无法仅通过检查会话并期待最新更新来做到这一点。

您可以使用该函数在程序期间的任何时间强制 PHP 写入会话session_write_close(),但正如您可能从函数名称中得知的那样,这也会关闭与该程序的会话,因此该程序无法进行任何进一步的更新给它。

我想你可以重新打开会话,但这开始冒险进入危险领域。即使它确实有效,它也将是非常低效的。

最终,PHP 会话被写入文件,就像任何其他输出一样,但是反复打开和关闭它会产生大量开销。因此,如果您正在考虑上述内容,请忘记它——您也可以让您的程序将其进度写入临时文件甚至数据库。或者,如果您想要性能,可以使用 memcache。

于 2013-09-03T13:46:14.877 回答