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

Прямо сейчас я работаю с PHP 5.3 и разрабатываю довольно простой вход с использованием нескольких разных классов объектов: User, который определяет пользователя. Сеанс, который запускает и поддерживает данные сеанса, и если кто-то вошел в систему, и База данных, которая выполняет запросы.

Итак, когда мой скрипт запускается, создается объект моего сеанса и т. Д., Но вот моя проблема. Когда я перехожу с одной страницы на другую, как отслеживается этот объект? Или, скорее, мой вопрос заключается в том, как PHP узнает, что объекты, относящиеся к моему логину, принадлежат мне, а не кем-то еще, кто вошел на сайт?

Я знаю, что если я делаю это без ООП, я бы просто проверял файл cookie сеанса на каждой странице и таким образом проверял свои данные, и это нормально, что мой мозг может с этим справиться. Но где и как отслеживаются данные объекта.

EG: На каждой странице, которую я хочу проверить, вошел ли кто-нибудь в систему, я ссылаюсь на $ session-> is_logged_in () и т.д. is_logged_in проверяет, является ли имя частной переменной истинным или ложным. На данный момент нет проверки файлов cookie, что означает, что этот объект все еще существует, и, поскольку он продолжает запрашивать сохраненную переменную, экземпляр должен сохраняться, чтобы быть полезным ... но как PHP, сервер, что бы ни связывало этот экземпляр этого объекта этому пользователю? Если все эти объекты будут плавать на сервере, пока я их не уничтожу, не будет ли много памяти, используемой объектами?

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

3
TooManyCooks 9 Мар 2010 в 16:42

3 ответа

Лучший ответ

Данные сеанса (то есть все данные в $ _SESSION) по умолчанию сериализуются и сохраняются в файл между запросами. Данные автоматически десериализуются при вызове session_start ().

Из руководства PHP по обработке сеансов (выделено мной):

Поддержка сеанса позволяет вам регистрировать произвольное количество переменных, которые будут сохраняться в запросах. Когда посетитель заходит на ваш сайт, PHP проверяет автоматически (если для session.auto_start установлено значение 1) или по вашему запросу (явно через session_start () или неявно через session_register ()), был ли отправлен конкретный идентификатор сеанса с запросом. В этом случае предыдущая сохраненная среда воссоздается .

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

5
Gordon 9 Мар 2010 в 16:44
1
Спасибо, Гордон, я думаю, что части моего мозга все еще трудно принять роль объекта. Я вернулся и изучил код, чтобы проследить его логику. Я ценю то, что будет делать сеанс, но я забыл о своем методе __construct и о том, что он вызывает другую функцию, которая проверяет, установлен ли мой сеанс. Итак, да, объект делает то, что я сделал бы в другом месте, только по-другому, то есть объект воссоздается путем простой загрузки включаемого файла, который затем заполняется данными сеанса. Спасибо, что заставили меня обдумать то, что я сказал, теперь я лучше понимаю.
 – 
TooManyCooks
9 Мар 2010 в 18:14

Я замечаю, что иногда, когда я начинаю терять представление о том, что на самом деле «происходит», быстрый переход на страницу с phpinfo(); или просто запись некоторых переменных ENV часто проясняет ситуацию и возвращает меня в нужное русло ...

Globals позволяет вам точно увидеть, что «существует» в вашей среде, и позволяет вам мысленно пополнить запасы того, с чем вы «работаете», и как лучше всего справиться с задачей. Вы найдете огромное количество информации и Что касается ваших конкретных «проблем», то здесь есть такие записи, как…

$_SERVER["HTTP_COOKIE"]
$_SERVER["QUERY_STRING"]
$_SERVER["argv | c"]
$include_path

Так далее…

Кроме того, никогда не помешает прочитать ваш /etc/php.ini (в любом случае) для небольшого разговора один на один с внутренними компонентами PHP - чтобы напомнить вам, «о чем все это».

0
Alex Gray 20 Янв 2012 в 07:33

Итак, когда мой скрипт запускается, создается объект моего сеанса и т. Д., Но вот моя проблема. Когда я перехожу с одной страницы на другую, как отслеживается этот объект? Или, скорее, мой вопрос заключается в том, как PHP узнает, что объекты, относящиеся к моему логину, принадлежат мне, а не кому-то еще, кто вошел на сайт?

Когда вы запускаете сеанс, создается идентификатор. Все данные сеанса связаны с этим идентификатором и передаются браузеру для хранения в файле cookie. Последующие запросы включают этот идентификатор в файл cookie, и PHP извлекает данные, откуда он сохранил его.

Если все эти объекты будут плавать на сервере, пока я их не уничтожу, не будет ли много памяти, используемой объектами?

Объекты сериализуются в файлы, а не хранятся в ОЗУ, и очищаются по истечении срока сеанса.

2
Quentin 9 Мар 2010 в 16:46