我有一个循环,它做了一些动作,在循环中我有一个递增的会话计数器。这个循环完成需要大约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秒调用一次)到上面的脚本
答案 0 :(得分:2)
默认情况下,PHP会话更改不会写入会话存储,直到程序结束;程序运行时,$_SESSION
就像任何其他变量一样;只能在自己的程序中访问;只有当程序结束并且会话被写入磁盘时,下一个程序才能获得您对会话数据所做的更改。所以简短的回答是,你只能通过检查会话并期待最新的更新来实现这一目标。
您可以使用session_write_close()
函数强制PHP在程序期间随时写入会话,但是您可以从函数名称收集,这也将关闭该程序的会话,以便程序无法对其进行任何进一步的更新。
我想你可以重新开启会议,但那已经开始冒险进入危险区域。即使它确实有效,也会效率很低。
最终,PHP会话被写入文件,就像任何其他输出一样,但是打开它并重复关闭它会有很大的开销。因此,如果您正在考虑上述情况,请忘记它 - 您也可以让您的程序将其写入临时文件甚至数据库。或者如果你想要性能,可以使用memcache。