Есть ли способ в PHP использовать постоянные данные, как в Java EE? (совместное использование объектов между потоками PHP) без сеанса и кеша / БД

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

Прошу извинить за неточность, я не понимаю, как правильно это написать.

Основная идея - иметь что-то вроде этого:

<?php
    ...
    // $variablesAlreadyLoaded is kind of "static" and shared between all PHP threads
    // No need to initialize/load/instantiate it.
    $myVar = $variablesAlreadyLoaded['aConstantValueForEveryone'];
    ...
?>

Я уже делал подобные вещи, используя shmop и другие странные вещи, но если есть «чистый» способ сделать это на «чистом PHP» без использования систем кэширования (я думаю о APC, Redis ...) или базе данных.

ИЗМЕНИТЬ 1:

Поскольку люди (благодаря тому, что они потратили на меня время) отвечают мне одинаково с сеансами, я добавляю ограничение, которое я пропустил, чтобы написать: никаких сеансов, пожалуйста.

ИЗМЕНИТЬ 2:

Похоже, что единственные собственные методы PHP для этого - это разделяемая память (shmop) и именованные каналы. Я бы использовал управляемый способ доступа к разделяемым объектам, не обращая внимания ни на управление памятью (размер блока разделяемой памяти), ни на системные проблемы (каналы).

Затем я поискал в сети модуль / библиотеку PHP, которая предоставляет функции / методы для этого: я ничего не нашел.

ИЗМЕНИТЬ 3:

После нескольких исследований пути, указанного @KFO, выяснилось, что putenv / setenv не предназначены для работы с объектами (и я бы избегал сериализации). Таким образом, он решает проблему с короткими "вещами", такими как строки или числа, но не с более большими / сложными объектами.

Использование "env way" И другого метода для работы с более крупными объектами было бы непоследовательным и добавило бы сложности коду и удобства обслуживания.

ИЗМЕНИТЬ 4:

Нашел: DBus (GREE Lab DBus), но я у меня нет инструментов, чтобы проверить это на работе. Кто-нибудь это уже тестировал?

Я открыт для каждого предложения.

Спасибо

ИЗМЕНИТЬ 5 («ОТВЕТ»):

Поскольку DBus - это не совсем то, что я ищу (необходимо установить сторонний модуль, без «серьезных» свидетельств приложения), теперь я использую Memcache, который уже доказал свою надежность (после комментария @PeterM, см. Ниже ).


person Benj    schedule 26.02.2013    source источник
comment
Честно говоря, с чем-то похожей проблемой я закончил с memcache   -  person    schedule 26.02.2013
comment
@PeterM: Хорошо, написано на плакате на экране, но это не соответствует первоначальным требованиям.   -  person Benj    schedule 26.02.2013
comment
@ArjanTijms: спасибо, что исправили ошибку в заголовке :)   -  person Benj    schedule 01.03.2013
comment
@Benj, можно. APC и Shmop stackoverflow.com/a/5605710/632951   -  person Pacerier    schedule 19.01.2015
comment
@Pacerier, Решение найдено с помощью Memcache   -  person Benj    schedule 22.01.2015


Ответы (4)


// First page
session_id('same_session_id_for_all');
session_start();
$_SESSION['aConstantValueForEveryone'] = 'My Content';

// Second page
session_id('same_session_id_for_all');
session_start();
echo $_SESSION['aConstantValueForEveryone'];

Это работает в PHP "из коробки". Использование одного и того же идентификатора сеанса (вместо случайной строки user-uniqe) для инициализации сеанса для всех посетителей приводит к сеансу, который является одинаковым для всех пользователей.


Действительно ли необходимо использовать сеанс для достижения цели или лучше использовать константы ?

В PHP нет чистого способа обмена информацией между разными потоками! За исключением решения «внешний» файл / база данных / переменная сервера / файл сеанса.


Поскольку некоторые комментаторы указали, что существует функция сериализации / десериализации для данных сеанса, которая может нарушить данные на транспорте, есть решение: в PHP функции сериализации и десериализации serialize_handler могут быть настроены по мере необходимости. См. https://www.php.net/manual/session.configuration.php#ini.session.serialize-handler Также может быть интересно взглянуть на методы магического класса __sleep() и __wakeup(), которые определяют, как объект ведет себя при запросе сериализации или десериализации. https://www.php.net/manual/language.oop5.magic.php#object.sleep ... Начиная с PHP 5.1 также доступен предопределенный Serializable интерфейс: https://www.php.net/manual/class.serializable.php

person powtac    schedule 26.02.2013
comment
Тот же комментарий: я хочу, чтобы его можно было использовать для каждого потока PHP, независимо от сеанса, в стиле сервлета. Более того, использование сеансов - это не то, что я хочу, поскольку он сериализует / десериализует данные каждый раз. // см. комментарий @PeterM. - person Benj; 26.02.2013
comment
Мне известно о принудительном использовании идентификатора сеанса, но это не то, что я ищу (написал: Нет необходимости инициализировать / загружать / создавать экземпляр). - person Benj; 26.02.2013
comment
Я обновил вопрос, благодаря вам я увидел то, что пропустил написать. - person Benj; 26.02.2013
comment
Хорошо, я вижу. В PHP нет чистого способа обмена информацией между разными потоками! За исключением решения для внешнего файла / базы данных / переменной сервера / файла сеанса. - person powtac; 26.02.2013
comment
Константы - это не то, что я ищу, объекты должны быть изменяемыми (мне известны проблемы с синхронизацией). - person Benj; 26.02.2013
comment
Я обновил свой вопрос: любой PHP / C / какой-либо модуль / библиотека для этого? - person Benj; 26.02.2013
comment
@Benj, извини, нет, я не знаю DBus. - person powtac; 27.02.2013

Вы можете объявить переменную в своем .htaccess. Например, SetEnv APPLICATION_ENVIRONMENT production и откройте его в своем приложении с помощью функции getenv('APPLICATION_ENVIRONMENT')

person KFO    schedule 26.02.2013
comment
Кажется интересным способом. Есть ли при этом проблемы с производительностью? Некоторые документы о тестах производительности или что-то в этом роде? - person Benj; 26.02.2013
comment
Если вы просто установите одну переменную с помощью setenv, вы не получите проблем с производительностью. Но если вы хотите настроить свое полное приложение, вам лучше создать файл конфигурации (или класс) и загружать этот файл при каждом запросе. - person KFO; 26.02.2013
comment
Вот пример использования фреймворка zend, который использует env для выбора конфигурации: stackoverflow.com/questions/2510556/ - person ; 26.02.2013
comment
@KFO: и загружать этот файл при каждом запросе нету нету нету мальчик, я написал не загружать / выгружать при каждом соединении. Это очень важно;) +1 за setenv / getenv - person Benj; 26.02.2013
comment
Вы можете объяснить, в чем ваша конкретная проблема? Я не понимаю, почему вы просто создаете новый файл, записываете все свои настройки и включаете этот файл в свой проект. - person KFO; 27.02.2013

Другое решение - поместить вашу переменную в класс «постоянных данных», который будет автоматически восстанавливать свое содержимое данных каждый раз, когда запускается скрипт php. Ваш класс должен:

  • сохранить содержимое переменной в файл в __destructor
  • загрузить содержимое переменной из файла в __constructor

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

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

person Erik Kalkoken    schedule 14.01.2016

Я думаю, вы можете использовать $_SESSION['aConstantValueForEveryone'], чтобы читать его на каждой странице одного и того же домена.

Рекомендуем обратиться к его руководству.

person Habibillah    schedule 26.02.2013
comment
Я хочу, чтобы его можно было использовать для каждого потока PHP, независимо от сеанса, в стиле сервлета. Более того, использование сеансов - это не то, что я хочу, поскольку он сериализует / десериализует данные каждый раз. - person Benj; 26.02.2013
comment
@Benj запросил переменную для всех не текущего пользователя - person ; 26.02.2013