Zend_Session теряет данные, но почему?

Я очень плохо знаком с этим Zend_Session. У меня работает приложение Zend Framework; теперь я хочу добавить к нему некоторые «фичи». Для одной из этих функций требуются некоторые данные, содержащиеся в сеансе, поэтому они хранятся на всех сайтах, которые посетит пользователь.

В моем Bootstrap у меня есть

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initSession() {
        Zend_Session::setOptions(array(
          'use_only_cookies' => 'on',
          'remember_me_seconds' => 864000
        ));
        Zend_Session::start();
    }
}

В моей модели есть функция, которая сохраняет данные в $_SESSION для заданного ключевого слова:

 $_SESSION['foo'][urlencode($keyword)] = array(   
              'data' => $base->some->foo[0]->fish->data         
            );

Новые данные устанавливаются только для сеанса, если сеансовый ключ (с ключевым словом) не установлен. Я проверил это с помощью отладчика zend, все работает хорошо.

Теперь, когда я сначала звоню на страницу, все идет хорошо. Когда я перезагружаю страницу (или перехожу на другую), значения в сеансе исчезают. Итак, если быть точным, ключи есть, массив $_SESSION имеет (например) 20 элементов размера. Запись есть, но она пустая.

$_SESSION['foo']['my+foo']['data'] = null

Когда я звоню:

Zend_Debug::dump($_SESSION['foo']['my+foo']);

Я получил:

array (size=1)
  'data' => null

Итак, он там, и это убило мою ценность.

Что такое волшебное вуду, чтобы заставить его работать, когда я использую простой session_start()?


person Paladin    schedule 04.09.2012    source источник
comment
Почему вы не используете Zend_Session? Zend Session имеет не столь простую внутреннюю структуру и может просто удалить ваши данные, сохраняя при этом свою информацию.   -  person Viktor S.    schedule 05.09.2012
comment
Это данные SimpleXML, которые вы пытаетесь сохранить в сеансе? Если это так, попробуйте выполнить преобразование в строку при вставке ее в сеанс: $_SESSION['foo'][urlencode($keyword)] = array( 'data' => (string)$base->some->foo[0]->fish->data );   -  person drew010    schedule 05.09.2012
comment
Лучше всего предположить, что вы перезаписываете свои данные где-то в цикле запроса и не знаете об этом (я сделал это, и его может быть трудно найти). Ознакомьтесь с Zend_Session_Namespace.   -  person RockyFord    schedule 05.09.2012
comment
Извините, без изменений. Пробовал с Zend_Session и простыми вещами session_start(), все то же самое. Пытался сохранить данные simplexml, как указано выше, без изменений. И: Это очень-очень простой проект ZF, я ничего не делаю в своем цикле запросов, что не является частью стандарта (я даже не знаю, как это изменить, даже если я этого хочу ;)). почему данные моего сеанса становятся нулевыми?   -  person Paladin    schedule 05.09.2012
comment
Итак, я понял, мне нужно преобразовать каждое отдельное значение из объекта simplexml в его представление в моем сеансе, тогда оно будет сохранено ... хорошо, спасибо, что привели меня на правильный путь, Draw010, вы поняли ;)   -  person Paladin    schedule 05.09.2012


Ответы (2)


Нажмите Ctrl + F и замените все на объект Zend_Session_Namespace вместо суперглобального $_SESSION:

$session = new Zend_Session_Namespace('foo');
$session->someData = array(   
    'data' => array('blah') 
);

Если ошибка сохраняется, расширяет Zend_Session_Namespace и ставит echo (для отладки) всякий раз, когда вы меняете данные сеанса, тогда вы сможете узнать, заменяется ли он другим фрагментом кода без вашего подтверждения.

Или лучше используйте интерактивный отладчик и проверяйте класс построчно (например, xDebugger). Это никогда не подводит ;)

person Keyne Viana    schedule 05.09.2012
comment
Извините, это ничего не изменило. Я расширил Zend_Session_Namespace, но не получил эха. Кажется, данные потеряются между двумя звонками. - person Paladin; 05.09.2012
comment
Итак, я отладил свой проект (отладчик Zend), и как только я вызываю session_start, создается мой объект $_SESSION, НО раздел «foo» заполнен правильными ключами, но все значения равны нулю, например: ['foo ']['bar']['data'] есть, но он нулевой. с другим разделом в $_SESSION все в порядке, $_SESSION['what'][0] есть и имеет правильные значения ... может быть, имена ключей слишком велики? - person Paladin; 05.09.2012

Draw010 сделал это, я должен сохранить каждое значение в его представлении в моем сеансе, поэтому

$_SESSION['foo']['bar'] = array(
 'data' => (int) $base->some->foo[0]->fish->data,
  'moredata' => (string)$base->some->foo[0]->fish->moredata
);

и так далее. Спасибо!

person Paladin    schedule 05.09.2012