Храня объекты на сессии PHP

В Xcode установите флажок «Требуется полный экран» в разделе «Основные»> «Цели», как показано ниже.

31
задан Uwe Keim 19 November 2016 в 17:54
поделиться

3 ответа

Вам необходимо использовать магические методы __sleep и __wakeup для объектов PHP 5.

Например, в следующем блоке кода:

$obj = new Object();

$_SESSION['obj'] = serialize($obj);

$obj = unserialize($_SESSION['obj']);

__ sleep вызывается сериализацией (). Метод сна вернет массив значений из объекта, который вы хотите сохранить.

__ wakeup вызывается unserialize (). Метод пробуждения должен принимать несериализованные значения и инициализировать их в объекте.

50
ответ дан 27 November 2019 в 22:15
поделиться

Это ожидаемое поведение. Сохранение ссылки на объект будет работать только в том случае, если место в памяти для объекта не изменилось. В протоколе без сохранения состояния, таком как HTTP, состояние приложения не сохраняется между запросами. Следующий запрос может быть обработан в другом потоке, процессе или другом сервере.

Учитывая неотъемлемую природу веб-приложения без сохранения состояния, хранение указателя на ячейку памяти бесполезно. Следовательно, состояние объекта должно быть разбито на формат хранения, сохранено или передано, а затем при необходимости восстановлено. Этот процесс известен как Сериализация .

Вы можете выбрать сериализацию всего объекта в сеанс (что может быть опасно в зависимости от глубины вашего графа объекта, поскольку ваш объект может содержать ссылки на другие объекты, и они также должны быть сериализованы), или если объект может быть восстановлен путем запроса базы данных при следующем запросе, вы можете просто спрятать идентификатор в сеансе.

а затем при необходимости восстановлен. Этот процесс известен как Сериализация .

Вы можете выбрать сериализацию всего объекта в сеанс (что может быть опасно в зависимости от глубины вашего графа объекта, поскольку ваш объект может содержать ссылки на другие объекты, и они также должны быть сериализованы), или если объект может быть восстановлен, запросив базу данных при следующем запросе, вы можете просто спрятать идентификатор в сеансе.

а затем при необходимости восстановлен. Этот процесс известен как Сериализация .

Вы можете сериализовать весь объект в сеанс (что может быть опасно в зависимости от глубины вашего графа объекта, поскольку ваш объект может содержать ссылки на другие объекты, и они также должны быть сериализованы), или если объект может быть восстановлен, запросив базу данных при следующем запросе, вы можете просто спрятать идентификатор в сеансе.

[EDIT]

JPot указал, что объекты автоматически сериализуются в $ _SESSION, поэтому явная сериализация не требуется. Я оставлю ответ потомкам, но, очевидно, это не решит вашу проблему.

0
ответ дан 27 November 2019 в 22:15
поделиться

В вашем примере кода не используются ссылки, как в документации. Это то, что php подразумевает под ссылками :

$var =& $GLOBALS["var"];

Что касается помещения объектов в сеанс, PHP может хранить объекты в $ _ SESSION . См. http://example.preinheimer.com/sessobj.php .

Вы видите ошибку в порядке вызовов __ sleep и ] __ destruct ( __ destruct вызывается до __ sleep ) и модулю сеанса не удается сериализовать объект при завершении работы. Эта ошибка была обнаружена 1 сентября 2009 г.

4
ответ дан 27 November 2019 в 22:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: