Форумы   Авторам статей    

Меню пользователя



Вход и регистрация недоступны в архивном режиме.


Партнеры






Опрос Населения

Форма отключена в архивном режиме.


Ссылки


Script Running Magic или хранение объектов на Слове
Автор: Антон Довгаль
Категория: PHP
Дата публикации: Пн 02 октября 2006
Просмотров: 283
Комментариев: 0

Поддержка сессий; Вызов удаленных функций; Хранение переменных, глобальных для всех приложений; Сервис для работы с удаленными глобальными объектами.

— Тяжело тащить? — Да нет, что ты. На Слово можно что угодно подвесить, разницы не чувствуешь.
(с) С.Лукьяненко, "Холодные берега"


Демон и экстеншен с 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.
Реклама




Статистика










Человек на сайте

0 Пользователей
2 Гостей


Copyright © 2007
Работает при помощи