Codeigniter会话挂起

时间:2014-02-06 15:10:10

标签: php codeigniter session

所以我使用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或删除正常的会话数据。
  6. 修改

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

    在等待页面完成加载后,我发现unset_userdata()正在运行,但它需要很长时间才能完成任务。

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

1 个答案:

答案 0 :(得分: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()

存储应在整个用户会话中保留的项目

如果您需要更多信息或者有些事情不清楚,请告诉我,我们很乐意更新答案。