【发布时间】: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');
总结:
- 我知道我应该使用
set_flashdata(),但是这个函数会挂起浏览器 -
set_userdata()工作正常,并在会话中创建值 -
unset_userdata()挂起浏览器 - 任何地方都没有错误消息。
- 删除
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