【问题标题】:Codeigniter session hangingCodeigniter 会话挂起
【发布时间】:2014-03-03 14:47:17
【问题描述】:

所以我将 codeigniter 用于我们的内部 Intranet。

通常在进行数据库选择、更新、删除等操作时,我使用 ajax,并使用 jquery 来更新页面而不进行重定向。

我需要实际提交表单而不是依赖 ajax。完成数据库操作后,我使用 codeigniters 会话设置了一些会话数据,然后将用户重定向回概览页面,它将从会话中检索信息并将其显示为“成功”消息。

我可以设置数据就好了:

$this->session->set_userdata('msg_title', 'Success');
$this->session->set_userdata('msg_content', 'Some success message here');

我也知道我应该使用flashdata 作为这样的例子,但似乎有一个错误。

当我使用 flashdata 设置数据时,或者当我尝试使用 unset_userdata() 取消设置用户数据时,浏览器会挂起。

我知道它的这两个功能,因为当我删除 set_flashdata()unset_userdata() 行时,脚本可以正常工作。

没有错误,错误日志中没有条目,控制台日志中没有任何内容。同一服务器(子域)上的其他网站工作正常。只是当我使用这些功能时,它似乎会挂起浏览器。

我使用的是 Chrome 32.0.1700.107,我也在 IE8 中测试过,遇到了同样的问题。

我已经在下面发布了相关的代码部分:

body.php - 我的观点

<?php if($this->session->userdata('msg_reply')): ?>
    <p class="big-message <?php echo $this->session->userdata('msg_colour_class'); ?>">
        <strong><?php echo $this->session->userdata('msg_title'); ?></strong><br>
        <?php echo $this->session->userdata('msg_message'); ?></strong>
    </p>

    <?php
        $this->session->unset_userdata('msg_reply'); 
        $this->session->unset_userdata('msg_colour_class');
        $this->session->unset_userdata('msg_title');
        $this->session->unset_userdata('msg_message');
    ?>

<?php endif; ?>

我的控制器

$this->session->set_userdata(array(
    'msg_reply' => true, 
    'msg_colour_class' => 'green-gradient', 
    'msg_title' => 'Contacts Updated', 
    'msg_message' => 'You have successfully updated ' . $i . ' out of ' . $t . ' contacts.'
));

redirect('my_department/student_absence');

总结:

  1. 我知道我应该使用set_flashdata(),但是这个函数会挂起浏览器
  2. set_userdata() 工作正常,并在会话中创建值
  3. unset_userdata() 挂起浏览器
  4. 任何地方都没有错误消息。
  5. 删除 set_flashdata()unset_userdata() 的实例可以解决问题,但也无法设置 flashdata 或删除正常的会话数据。

编辑

我自动加载会话库,以便每个页面都可以使用它。 此外,尝试在控制器中取消设置会话数据会导致浏览器挂起。

在等待页面完成加载后,我发现unset_userdata() 正在工作,但它需要很长时间才能做任何事情。

我现在已经运行了 3 次重新加载脚本,每次重新加载页面都需要 2 分钟。

【问题讨论】:

  • 对不起,我忘了在帖子中提到这一点,我已经自动加载了会话库,因为每个页面都依赖会话来验证用户(它是一个包含敏感信息的封闭内部 Intranet)。
  • 好的,它似乎可以正常工作,但是删除会话数据需要 2 分钟。我已经使用 Chrome 开发人员工具检查了这一点,从按下提交按钮到页面完成加载,需要 2 分钟。删除 unset_userdata() 函数,页面只需不到 3 秒。
  • 即使会话库已经加载,如上所述,$this 也没有什么可指出的,我很惊讶你没有收到错误。无论如何,至于时间问题,我建议首先在控制器中管理会话。你试过那条路吗?
  • @PhilCross 我担心使用多个userdata()unset_userdata() 方法会导致开销。每个调用都会运行一个数据库查询。我不确定,启用profiler 来检查查询。并尝试一次获取或取消设置会话数据:使用unset_userdata($array_items);all_userdata()
  • @zarathuztra 我已将整个段添加到控制器中,现在以正常速度运行!如果您将其发布为答案,我很乐意接受!

标签: php codeigniter session


【解决方案1】:

正如 Hashem 之前提到的,多次调用会话管理方法会增加很多开销。此外,尝试在控制器而不是视图中管理会话。为了访问通常绑定到控制器和模型中的 $this 上下文的 codeigniter 对象,您必须通过 get_instance() 获取对该对象的引用,这会增加更多开销。

也就是说,将会话管理移至控制器本身,无论如何都应该这样做。您应该在会话对象中设置并传递到视图中的唯一内容是维护会话所需的数据,并提供干净的用户体验。

鉴于您似乎传递的消息,flashdata 似乎是最合适的路线。因此,而不是以下内容:

$this->session->set_userdata('msg_title', 'Success');
$this->session->set_userdata('msg_content', 'Some success message here');

你应该使用这个

$this->session->set_flashdata('msg_title', 'Success');
$this->session->set_flashdata('msg_content', 'Some success message here');

Flash 数据在下一次请求时被清除,因此无需调用 unset,进一步减少开销。只有那些应该在整个用户会话中持续存在的项目才应该使用 set_userdata() 进行存储

如果您需要更多信息或不清楚的地方,请告诉我,我很乐意更新答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-13
    • 2013-04-12
    • 2015-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多