Хранение переменных, глобальных для всех приложений;
Сервис для работы с удаленными глобальными объектами.
Те, кто работал в ASP с объектом Application (я не работал), сразу поймут, зачем нужен SRM. Действительно, для ASP программеров это вещь привычная. Не работавшим с ним постараюсь объяснить. Через пару часов разбирания с SRM у меня появилась четкая ассоциация ? "хранение на Слове" (кто читал С.Лукьяненко "Холодные берега" ? тот поймет сразу).
Действительно четкая аналогия:
SRM хранит объекты у себя "в холоде", однако доступен список только уже загруженных объектов, а не всех доступных;
удаленный объект ведет себя точно так же, как объект этого класса, объявленный в скрипте, однако его свойства через var_dump не увидишь (ориентация наощупь);
объект грузится один раз при первом обращении, после этого он начинает свое "удаленное существование";
свойства и методы объекта доступны любому скрипту;
кроме объектов, SRM хранит библиотеку функций и глобальные для всех скриптов переменные;
с помощью SRM можно "кэшировать" соединение с базой (по предварительным тестам это дает ощутимое ускорение), одно на все скрипты;
Варианты использования SRM:
счетчик юзеров на сайте;
кэширование соединений с базой и часто выбираемых данных из базы;
глобальные настройки сайта и темплейты;
общие для всех объекты;
ваш вариант =).
Принцип работы SRM:
демон при запуске читает , подбирает из function_library глобальные функции и слушает указанный порт и сокет.
клиентский скрипт обращается к демону и тот отдает ему результаты выполнения функций. Именно отдает результаты, функции типа echo, print в удаленных объектах не выведут на экран ничего (а вот в лог демона ? выведут).
Объекты классов-детей Banana не подбираются сразу (), а только при первом обращении. При этом, как и у обычных объектов, выполняется конструктор и др. Далее доступны методы и свойства этого объекта, однако через var_dump вы их не увидите, как я уже сказал.
Скрипты, в которых объявляются классы удаленных объектов имеют требование к наименованию: так, класс Users должен содержаться в Users.banana.php и быть наследником класса Banana. Так же в конце класса добавляются две строчки (см. пример), необходимые для инициализации удаленного объекта.
Наглядный пример: класс удаленного объекта: <? /* Club.banana.php */ /* Класс Club */ Class Club extends Banana { var $members;
function Club () { $this->members="0"; }
function increase () { $this->members++; } }
$club = new Club(); $club->run(); ?>
и клиентский скрипт: <? /* club.php */ $srm = new SRM ("/tmp/srm.socket", 7777);
$t = new SRMApp ($srm,"Club"); $t->increase(); echo $t->members."_n";
print_r($t); ?>
Кладем класс в class_path, рестартим srmd и выполняем клиентский скрипт. На выходе получем: --=-- [цифра] srmapp Object ( [conn_id] => Resource id #2 [handle] => 1 ) --=--
Цифра будет увеличиваться с каждым рефрешем. Естественно, если закомментить строку с increase(), то ее значение останется прежним. Похоже на сессию, основное различие в том, что она одна на всех.
Подобный класс можно прикрутить к форуму, вместо просто присвоения свойства members в конструкторе можно сделать подсчет членов клуба в базе (незачем эту выборку делать каждому посетителю на каждой странице), в случае добавления или удаления ? вызывать соответствующий метод класса ? inrease или decrease (увеличение на 1 и уменьшение соотв-но).
По-моему очень удобно.
Аналогично организуется класс UsersOnSite. Принцип прост ? выставлять человеку уникальную куку, проверять есть ли она у нас, нет ? +1 человек, проверяем таймауты у юзеров, кого-то удаляем и т.п.
Пока не работает, но в ближайшем будущем обещается (по словам Derick Rethans):
например, сохранение и поднятие дампа между перезапусками демона);
удаленные объекты не могут содержать другие удаленные объекты и ссылки на них;
и еще много полезных features;
ещё нет версии для Win(и вряд-ли появится в ближайшее время).
Также НЕ поддерживается (и скорее всего не будет): видимость переменных среды PHP ($_SERVER, $_COOKIE etc.) в удаленных объектах по чисто техническим причинам ? демон srmd работает, не зная об апаче ничего.
Не знаю как вас, а меня появление такого extension, несмотря на его сырость, само по себе уже очень радует. Может, и вправду "PHP goes to the enterprise level"?
Если это кого-то кроме меня радует ? могу написать также, как я ставил и настраивал демона и экстеншен к ПХП.
(1) если объектов нет в дампе после последнего шатдауна, которые он при прошлом выходе записал (srmd дампит свой "карман" при выходе и при запуске его подхватывает)