Область действия PHP, $ GLOBALS & Singletons - PullRequest
3 голосов
/ 18 апреля 2011

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

Допустим, у нас есть 2 пользователя, подключающихся к одному и тому же серверу LAMP из разных уголков мира одновременно, и оба запрашивают Widget.php.

(a) Как Apache / PHP эффективно «копирует 2 экземпляра» сценария Widget.php и его зависимостей, так что 2 HTTP-запроса обрабатываются отдельно?

(б) Исходя из части (а) выше, как PHP разделяет запросы пользователей, чтобы разделить их? Если Widget.php использует сеансовую переменную с именем $_SESSION['cheese'], как PHP хранит значение сыра отдельно для обоих пользователей?

(c) Является ли PHP $GLOBALS пользовательским или прикладным? Это означает, что для глобальной переменной $GLOBALS['bread'] пользователи 1 и 2 совместно используют одну и ту же ссылку на нее, или PHP хранит их отдельно, как это было с переменной сеанса, указанной выше в (b)?

(d) В чем разница между переменной PHP $GLOBALS и объектом, который реализует одноэлементный дизайн? Если приложение когда-либо имеет доступ только к 1 экземпляру синглтона, не является ли оно глобальным? Есть ли какие-то соображения относительно производительности, которые следует учитывать?

Ответы [ 4 ]

3 голосов
/ 18 апреля 2011

Думайте о приложении php как о скрипте, который выполняется каждый раз, когда сервер запрашивает его, а не как о приложении, которое существует в памяти сервера.Когда в запрос приходит HTTP-запрос, сценарий запускается, поэтому $ _SESSION ['cheese'] будет уникальным для пользователя, который запрашивает его, поскольку идентификатор сеанса хранится на стороне клиента в файле cookie браузера.

Глобальные переменные - это просто переменныес широкой областью действия сценария, поэтому он будет таким же для пользователя, который отправил сценарий HTTP-запроса.Синглтон - это класс, который может иметь только один экземпляр и не совпадает с глобальным.

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

1 голос
/ 18 апреля 2011

а) вы спрашиваете, как работает apache / php ??= P это амбициозно ... Короче говоря: php будет компилировать Widget.php при каждом запросе, а apache отправит ответ по протоколу Http

b) ваш сервер сохранит данные SESSION в базе данных илифайл или волшебное место (на самом деле не знаю, где и как он это делает, все, что меня волнует, это то, что он сохранен).При каждом запросе браузер отправляет файл cookie сеанса, содержащий идентификатор сеанса, который PHP будет использовать для загрузки соответствующей информации в переменную $ _SESSION.(как первичный ключ в таблице базы данных)

c) он распространяется на пользователя (на стороне скрипта), но не будет сохраняться между страницами, такими как сеанс.

d) $ GLOBALS - это переменная, одиночный объект - это объект, который имеет атрибуты, методы, средства доступа, может быть унаследован, перезаписан и т. Д.

Удачи!

1 голос
/ 18 апреля 2011

(a) PHP работает как большинство других реализаций CGI.Когда веб-сервер получает запрос на конкретный URL-адрес, который является сценарием .cgi / .php, интерпретатор вызывается с помощью указанного сценария.Интерпретатор PHP запускает его и отправляет вывод обратно на веб-сервер / клиент.После завершения этот интерпретатор CGI завершает работу и забирает все свои данные времени выполнения.

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

(b) Массив $ _SESSION обрабатывается PHP.Он может различить хранилище для каждого пользователя, используя уникальный ключ cookie.И поскольку каждый процесс CGI или mod_php имеет отдельный пул переменных, проблем на самом деле нет.PHP просто нужно немного заблокировать файлы, чтобы два сценария не могли перезаписать хранилище сеансов, когда один и тот же пользователь запросил два сценария одновременно.

(c) «Глобальные» переменные также существуют только для каждого процесса.Они исчезли, как и все остальное, когда скрипт PHP закончился.

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

0 голосов
/ 18 апреля 2011

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

$ GLOBALS - это область применения.

Объекты Singleton являются глобальными, но вы не обязательно должны иметьэкземпляр одного, существующий в конкретный момент ...

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