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

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

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

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

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

Ответ 1

Это немного сложный ответ, и, возможно, это не совсем то, что вы ищете.

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

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

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

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

Привет!