2014-02-06 93 views
2

所以我使用codeigniter作为我们的内部Intranet。Codeigniter会话挂起

通常在做数据库选择,更新,删除等操作时,我使用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()取消设置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分钟才能重新载入页面。

+0

对不起,我忘了在帖子中提到这一点,我已经自动加载会话库,因为每个页面都依赖会话来验证用户(它是一个封闭的内部敏感信息内部网)。 –

+0

好吧,它似乎正在工作,但需要2分钟才能删除会话数据。我已经使用Chrome开发人员工具检查了这一点,然后从提交按钮到完成加载的页面,这需要2分钟。除去'unset_userdata()'函数,这些页面只需要3秒钟。 –

+0

即使会话库已经加载,$这没有什么可指向上面提到的,我很惊讶你没有得到一个错误。无论如何,至于时间问题,我建议首先在控制器中管理会话。你尝试过这条路线吗? – Zarathuztra

回答

1

正如Hashem之前提到的那样,使用多次调用会话管理方法会增加很多开销。此外,请尝试在控制器中管理会话而不是视图。为了访问codeigniter对象,通常绑定到控制器和模型中的$ this上下文,您必须通过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'); 

闪存数据被清除,因此调用未设置是没有必要的,减少开销进一步。只有那些应该在整个用户会话中持续存在的项目应该使用set_userdata()

请让我知道如果您需要其他信息或者如果有什么不清楚的地方,我会很乐意更新答案。