Как PHP отслеживает созданные объекты? - PullRequest
3 голосов
/ 09 марта 2010

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

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

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

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

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

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

Ответы [ 3 ]

5 голосов
/ 09 марта 2010

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

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

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

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

2 голосов
/ 09 марта 2010

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

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

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

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

0 голосов
/ 20 января 2012

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

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

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

и т.д ...

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...