【问题标题】:Access session variable that is set in Script 1, in Script 2. PHP访问在脚本 1 中设置的会话变量,在脚本 2 中。 PHP
【发布时间】:2013-09-06 18:40:59
【问题描述】:

我有一个执行某些操作的循环,在循环内我有一个递增的会话计数器。这个循环完成大约需要 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 秒调用一次)到上述脚本

【问题讨论】:

  • 您开始会话了吗?
  • 我已经在下面发布了我对您问题的直接回答,但题外话我很好奇:您的程序到底在做什么需要 10-15 分钟?对于使用 PHP 的大多数事情,以及对于大多数数据库的大小,我认为你很有可能从它中获得比通过一些优化获得更好的性能。
  • 它确实将一个巨大的 excel 文件导入数据库。花费很长时间检查包含多达 700 万条记录的表的重复项

标签: php ajax session


【解决方案1】:

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

您可以在程序期间的任何时间使用session_write_close() 函数强制 PHP 写入会话,但是从函数名称中可以看出,这也会关闭与该程序的会话,因此该程序可以'不要对其进行任何进一步的更新。

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

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

【讨论】:

  • 所以你建议创建一个临时表之类的东西并在那里取得进展会更好?
  • @GGio - 是的,正是如此。 php 会话不会以您想要的方式为您工作。使用临时表或临时文件,或内存缓存数据,或其他任何东西......只是会话以外的东西。
  • 有道理。非常感谢现在将使用临时表,并将研究 memcache 以改进它,
猜你喜欢
  • 1970-01-01
  • 2021-04-15
  • 2015-01-19
  • 2012-04-23
  • 1970-01-01
  • 1970-01-01
  • 2012-05-25
  • 2012-04-25
  • 2015-01-03
相关资源
最近更新 更多