2014-02-06 4 views
2

Поэтому я использую codeigniter для нашей внутренней интрасети.Видимость сеанса 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(), браузер зависает.

Я знаю его эти две функции, потому что когда я удаляю строки set_flashdata() или unset_userdata(), скрипт отлично работает.

Ошибок нет, нет записей в журнале ошибок, ничего в журнале консоли. Другие сайты на одном сервере (субдомены) работают нормально. Только когда я использовал эти функции, он, кажется, повесил браузер.

Я использую Chrome 32.0.1700.107, и я также тестировал его в IE8, который испытывает ту же проблему.

Я отправил соответствующие разделы кода ниже:

body.php - My View

<?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 или удалить обычные данные сеанса.

EDIT

Я AutoLoad библиотеку сеанса поэтому для каждой страницы. Кроме того, попытка сброса данных сеанса в контроллере зависает в браузере.

После ожидания загрузки страницы, я обнаружил, что работает unset_userdata(), но он принимает возраст, чтобы что-либо сделать.

Я запустил сценарий перезагрузки 3 раза сейчас, и каждый раз для перезагрузки страницы требуется ровно 2 минуты.

+0

К сожалению, я забыл упомянуть об этом в сообщении, я автоматически загрузил библиотеку сеансов, поскольку каждая страница использует сеансы для проверки пользователей (закрытая внутренняя интрасеть с конфиденциальной информацией). –

+0

Ок, похоже, работает, однако для удаления данных сеанса требуется 2 минуты. Я проверил это, используя инструменты разработчика Chrome, и нажав кнопку отправки, до загрузки страницы, она занимает 2 минуты. Удаляя функцию 'unset_userdata()', страницы занимают менее 3 секунд. –

+0

даже с уже загруженной сессией lib, $ это не имеет никакого значения, как упоминалось выше, я удивлен, что вы не получаете ошибку. В любом случае, что касается вопроса синхронизации, я бы рекомендовал управлять сессиями в контроллере в первую очередь. Вы пробовали этот маршрут? – Zarathuztra

ответ

1

Как уже упоминалось ранее Хашем, использование нескольких вызовов методов управления сеансами добавляет много накладных расходов. Кроме того, попробуйте управлять сеансами в контроллере вместо представления. Чтобы получить доступ к объекту 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'); 

флэш данные удаляются при следующем запросе, поэтому вызов снят с охраной не является необходимым, уменьшением накладных расходов в дальнейшем. Только те элементы, которые должны сохраняться во всей сессии пользователя, должны храниться с помощью set_userdata()

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация или что-то неясно, и я буду рад обновить ответ.

Смежные вопросы