在脚本1中的脚本2中设置的访问会话变量.PHP

时间:2013-09-03 13:38:06

标签: php ajax session

我有一个循环,它做了一些动作,在循环中我有一个递增的会话计数器。这个循环完成需要大约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秒调用一次)到上面的脚本

1 个答案:

答案 0 :(得分:2)

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

您可以使用session_write_close()函数强制PHP在程序期间随时写入会话,但是您可以从函数名称收集,这也将关闭该程序的会话,以便程序无法对其进行任何进一步的更新。

我想你可以重新开启会议,但那已经开始冒险进入危险区域。即使它确实有效,也会效率很低。

最终,PHP会话被写入文件,就像任何其他输出一样,但是打开它并重复关闭它会有很大的开销。因此,如果您正在考虑上述情况,请忘记它 - 您也可以让您的程序将其写入临时文件甚至数据库。或者如果你想要性能,可以使用memcache。