Есть ли способ поделиться объектом между php-страницами? - PullRequest
12 голосов
/ 26 мая 2009

Я новичок в php, но в других веб-технологиях вы можете делиться объектами между экземплярами страницы. Например, на страницах java jsp вы легко имеете класс, который существует как статический класс для всего экземпляра сервера. Как это сделать в php?

Я не ссылаюсь на переменные сессий (по крайней мере, я так не думаю). Это больше для целей пула ресурсов (возможно, сокет для совместного использования или соединения с базой данных и т. Д.). Таким образом, целый класс должен быть разделен между последующими загрузками, а не только некоторые примитивные переменные, которые я могу сохранить в сеансе.

Я также изучал возможность создания синглтон-классов php, но я считаю, что этот класс используется только на одной странице, а не на разных.

Чтобы сделать вещи еще яснее, я ищу что-то, что может помочь мне поделиться, скажем, сокетом, подключенным к серверу, для страницы connectSocket.php, чтобы все пользователи, загружающие эту страницу, использовали один и тот же сокет и делали это. не открывать новый.

Ответы [ 5 ]

15 голосов
/ 26 мая 2009

Это довольно сложный ответ, и он может быть не совсем тем, что вы ищете.

PHP построен на архитектуре «без разделения ресурсов». Если вам требуется какой-либо тип состояния в вашем приложении, вы должны сделать это другими способами.

Сначала я бы порекомендовал разобраться в сути проблемы. Вам это действительно нужно? Если вы предполагаете, что приложение PHP может умереть (и потерять состояние), можно ли потерять данные?

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

Если вы не заботитесь о потере данных после перезапуска, проблемная область, которую вы ищете, вероятно, кешируется. Я бы порекомендовал посмотреть memcached или, если вы работаете на одной машине, apc . APC определенно будет работать для вас с Apache на одной машине, но вам все равно придется кодировать свое приложение, предполагая, что вы можете потерять данные.

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

Если данные являются чисто пользовательскими или привязанными к сеансу, вам, вероятно, нужно просто заглянуть в систему сеансов.

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

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

12 голосов
/ 26 мая 2009

Существует фундаментальное различие между веб-Java и веб-интерпретируемыми языками, такими как PHP и Perl. В Java ваш веб-сервер будет иметь операционную среду, которая поддерживает состояние (например, Tomcat). При использовании интерпретируемых языков запрос к вашему веб-серверу обычно создает новый поток веб-сервера, который, в свою очередь, загружает новую операционную среду для этого потока, в данном случае среду PHP.

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

Поэтому обмен сокетами между веб-запросами не представляется возможным.

3 голосов
/ 26 мая 2009

Вероятно, это частичный ответ, но вы можете сохранить экземпляр класса в переменную Session и получить к нему доступ в другое время.

1 голос
/ 26 мая 2009

Большинство библиотек баз данных PHP уже используют пулы соединений. Вы вызываете, например, pg_connect, как если бы вы запрашивали новое соединение, но если строка соединения совпадает с уже существующим, вы получите вместо этого установленное соединение. Если вам нужен только пул для доступа к базе данных, вы можете просто подтвердить, что он существует в используемой вами библиотеке db.

0 голосов
/ 14 апреля 2010

Другое ужасное решение может состоять в том, чтобы загрузить данные объекта в любую переменную $ _SESSION и затем передать ее обратно в объект другой страницы. Фактически, это решение, которому я буду следовать в своем проекте, пока не получу какое-нибудь лучшее решение.

Привет! * * 1003

...