我有一个执行某些操作的循环,在循环内我有一个递增的 session 计数器。这个循环大约需要 10-15 分钟才能完成,所以我想要某种进度条来告诉用户循环已经进行了多远。
我的 AJAX 调用假设检索我在循环内设置的 session 的值,但它似乎不起作用。我收到未定义索引错误。
我在某处读到, session 一旦被一个脚本使用就会被锁定,直到它完成使用它为止,不会解锁它。是否可以强制解锁 session ,以便我的 ajax 脚本可以检索 session 的值?
示例:
脚本 1(循环):
while(SOME CONDITION) {
//DO ACTIONS
$_SESSION['progress'] = $currProgress + 1;
}
脚本 2(AJAX 调用检索 session ):
function getCurrentProgress() {
$progress = isset($_SESSION['progress']) ? $_SESSION['progress'] : 0;
echo json_encode(array('progress' => $progress));
}
JS AJAX(每 30 秒调用一次)到上述脚本
最佳答案
默认情况下,直到程序结束,PHP session 更改才会写入 session 存储;当程序运行时,$_SESSION
就像任何其他变量一样;只能在其自己的程序中访问;只有当程序结束并将 session 写入磁盘时,下一个程序才能获取您对 session 数据所做的更改。因此,简短的回答是,您无法仅通过检查 session 并期待最新更新来做到这一点。
您可以使用 session_write_close()
函数在程序运行过程中的任何时间强制 PHP 写入 session ,但正如您从函数名称中可以了解到的那样,这也会关闭 session 该程序,以便该程序无法对其进行任何进一步更新。
我想您可以重新打开 session ,但这开始冒险进入危险领域。即使它确实有效,效率也会很低。
最终,PHP session 会像任何其他输出一样写入文件,但重复打开和关闭它会产生大量开销。因此,如果您正在考虑上述情况,请忘记它 - 您也可以让程序将其进度写入临时文件甚至数据库。或者,如果您想要性能,也许可以使用 memcache。
关于php - 访问脚本 1、脚本 2 中设置的 session 变量。 PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18593814/