Я новичок в php, но в других веб-технологиях вы можете обмениваться объектами между экземплярами страниц. Например, в java-страницах jsp вы легко можете иметь класс, который существует как статический класс для всего экземпляра сервера. Как это сделать в php?
Я не имею в виду переменные сеансов (по крайней мере, я так не думаю). Это больше подходит для пула ресурсов (возможно, для совместного использования сокетов или соединений с базой данных и т. Д.). Таким образом, весь класс должен делиться между последующими нагрузками, а не только некоторыми примитивными переменными, которые я могу сохранить в сеансе.
Я также изучал классы php singleton, но считаю, что класс распространяется только на одной странице, а не на разных страницах.
Чтобы сделать вещи еще более ясными, я ищу что-то, что может помочь мне поделиться, скажем, сокетом, подключенным к серверу для страницы connectSocket.php, так что все пользователи, которые загружают эту страницу, используют один и тот же сокет и не открывают новый.
Это немного сложный ответ, и, возможно, это не совсем то, что вы ищете.
PHP построен на архитектуре «shared-nothing». Если вам требуется какое-то состояние в вашей заявке, вы должны сделать это с помощью других средств.
Сначала я бы рекомендовал заглянуть в суть проблемы. Вам это действительно нужно? Если вы предполагаете, что приложение PHP может умереть (и потерять состояние), нормально ли потерять данные?
Если вы должны поддерживать состояние, даже после того, как приложение умирает или каким-либо иным образом, вы должны предпочесть, что лучше всего разместить данные в MySQL. PHP предназначен как тонкий слой вокруг вашей бизнес-логики, поэтому я могу очень порекомендовать это.
Если вы не хотите потерять данные после перезагрузки, проблемный домен, который вы ищете, вероятно, кэшируется. Я бы рекомендовал заглянуть в memcached или если вы на одной машине, apc . APC определенно будет работать для вас с Apache на одной машине, но вам все равно придется закодировать приложение, если вы потеряете данные.
Если вы беспокоитесь, что ваш базовый хранилище данных (MySQL) работает слишком медленно, но вам все равно нужно поддерживать данные после перезагрузки, вы должны изучить комбинацию этих двух систем. Вы всегда можете выталкивать и извлекать данные из кеша, но только тогда, когда он обновляет, отправляет его в Mysql.
Если данные являются чисто пользовательскими или связанными с сеансом, вы, вероятно, хотите просто изучить систему сеансов.
Я лично разработал достаточно крупное многопользовательское приложение, и, хотя это довольно сложное приложение, мне никогда не требовалось истинное состояние, которое вы ищете.
Обновление : Извините, я не читал вашу заметку о совместном использовании сокета. Для этого вам понадобится отдельный демон, возможно, если вы сможете объяснить свою проблему дальше, могут быть и другие подходы. Какой тип сокета это?
Существует фундаментальное различие между веб-сервисами Java и веб-сервисами, интерпретируемыми как PHP и Perl. В Java ваш веб-сервер будет иметь рабочую среду, поддерживающую состояние (то есть Tomcat). С интерпретируемыми языками запрос на ваш веб-сервер обычно порождает новый поток веб-сервера, который, в свою очередь, загружает новую рабочую среду для этого потока, в данном случае среду PHP.
Поэтому в PHP нет понятия экземпляров страниц. Каждый запрос на веб-сервер является новым началом. Все классы перезагружены, поэтому нет концепции совместного использования классов и нет концепции пула ресурсов, если она не реализована извне.
Таким образом, совместное использование сокетов между веб-запросами невозможно.
Вероятно, это частичный ответ, но вы можете сохранить экземпляр класса в переменную сеанса и получить доступ к нему в другое время.
Большинство библиотек баз данных PHP уже используют пул соединений. Вы вызываете, например, pg_connect, как если бы вы запрашивали новое соединение, но если строка соединения совпадает с уже существующим соединением, вместо этого вы получите установленное соединение. Если вы только заботитесь о пуле для доступа к базе данных, вы можете просто подтвердить, что он существует в используемой библиотеке db.
Другим приемлемым решением может быть загрузка данных объекта в любую переменную $ _SESSION, а затем обратно обратно в объект другой страницы. На самом деле, это решение, которое я собираюсь выполнить в своем проекте, пока не получу какой-то лучший.
С уважением!