Script Running Magic или хранение объектов на Слове
Автор: Антон Довгаль
Резюме:
Демон и экстеншен с API для него к PHP.
Разработчик: The Vulcan
Logic Group (список
разработчиков).
Язык: C
Предназначение:
- Поддержка сессий;
- Вызов удаленных функций;
- Хранение переменных, глобальных для всех приложений;
- Сервис для работы с удаленными глобальными объектами.
Те, кто работал в ASP с объектом Application (я не
работал), сразу поймут, зачем нужен SRM. Действительно, для
ASP программеров это вещь привычная. Не работавшим с ним
постараюсь объяснить. Через пару часов разбирания с SRM у меня
появилась четкая ассоциация — "хранение на Слове" (кто
читал С.Лукьяненко "Холодные берега" — тот поймет сразу).
Действительно четкая аналогия:
- SRM хранит объекты у себя "в холоде", однако доступен
список только уже загруженных объектов, а не всех доступных;
- удаленный объект ведет себя точно так же, как объект
этого класса, объявленный в скрипте, однако его свойства
через var_dump не увидишь (ориентация наощупь);
- объект грузится один раз при первом обращении, после
этого он начинает свое "удаленное существование";
- свойства и методы объекта доступны любому скрипту;
- кроме объектов, SRM хранит библиотеку функций и
глобальные для всех скриптов переменные;
- с помощью SRM можно "кэшировать" соединение с базой (по
предварительным тестам это дает ощутимое ускорение), одно на
все скрипты;
Варианты использования
SRM:
- счетчик юзеров на сайте;
- кэширование соединений с базой и часто выбираемых данных
из базы;
- глобальные настройки сайта и темплейты;
- общие для всех объекты;
- ваш вариант =).
Принцип работы SRM:
- демон при запуске читает srm.ini,
подбирает из function_library глобальные функции и слушает
указанный порт и сокет.
- клиентский скрипт обращается к демону и тот отдает ему
результаты выполнения функций. Именно отдает результаты,
функции типа echo, print в удаленных объектах не выведут на
экран ничего (а вот в лог демона —
выведут).
Объекты классов-детей Banana не подбираются сразу (1), а
только при первом обращении. При этом, как и у обычных
объектов, выполняется конструктор и др. Далее доступны методы
и свойства этого объекта, однако через 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
дампит свой "карман" при выходе и при
запуске его подхватывает)
Файл srm.ini
#######
modules {
path = "/usr/local/srm/lib/";
load "auth";
load "http";
load "php4";
}
srm {
sockname = "/tmp/srm.socket";
port = 7777;
log_level = 100;
logfile = "/var/log/srm";
}
store {
application_items = 2048;
session_items = 4096;
application_lock_items = 1024;
session_lock_items = 1024;
session_save_path = "/var/state";
}
http {
port = 7780;
}
banana {
class_path = "/usr/local/srm/banana/lib";
function_library = "/usr/local/srm/banana/lib/library.php";
}
#######
Пояснения:
- modules — подгружаемый модули SRM. Для работы с PHP
нужен специфически собранный PHP (об этом позже). Без него
работают модули auth & http.
- srm — надеюсь, что тут комментарии не нужны.
- store — установки количества элементов, хранимых в
памяти и в сессиях (у SRM свои собственные сессии, в которые
он пишет дамп при shutdown и откуда читает при старте).
- banana — настройки виртуального класса, которыя
является родителем для всех классов, которые можно
использовать с SRM.