Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #83, НОЯБРЬ 2005 г.

Самопальный сервис

eto'o

Хакер, номер #083, стр. 083-124-5


}

Вот так выглядит создание элементарного сервиса и клиента к нему.

[структуры посложнее]

Теперь расскажу о том, каким образом возможно транспортировать нескалярные переменные вроде массивов и структура данных. Ведь действительно, очень часто в этом есть огромная необходимость. Ну, скажем, в нашей воображаемой распределенной системе управления ботнетом может появиться необходимость получить всю информацию о ботах, зарегистрированных за определенную дату на определенном сервере, а не просто пересчитать их, как мы это делали в примере выше. Сейчас я покажу тебе, каким образом сервер может ответить клиенту массивом данных. Новая функция, которая будет ассоциирована с методом ViewBotInfo, который мы добавим к нашему сервису, называется BotInfo:

[функция, которая возвращает массив структур с информацией о ботах]

function BotInfro($params) {

$param = $params->getParam(0);

$re=mysql_query("select * from bots where date_reg='$param->scalarval()'");

$val=new XML_RPC_Value();

$bots=array();

$i=0;

while($res=mysql_fetch_array($re)) {

$bots[$i]=new XML_RPC_Value(array(

"ip" => new XML_RPC_Value("$res[ip]"),

"country" => new XML_RPC_Value("$res[country]"),

"date_r" => new XML_RPC_Value("$res[date_r]")), "struct");

$i++;

}

$val->addArray($bots);

return new XML_RPC_Response($val);

}

Видно, что в первых двух строчках функции я получаю параметр - дату для выборки и создаю SQL-запрос к базе данных. Затем создается переменная $val класса XML_RPC_Value, инициализируется массив $bots c ботами. После этого в цикле по всем возвращенным запросом записям таблицы этот массив заполняется структурами, несущими информацию о ботах. Разумеется, все это условно, реальные структуры могут быть значительно сложнее, но общий принцип именно такой.

После этого цикла, когда создан «массив ботов», необходимо из этого массива изготовить переменную класса XML_RPC_Value. Для чего к уже созданному объекту, при помощи метода addArray(), добавляется наш массив.

Клиентская сторона, которую так же необходимо реализовать, работает аналогично уже разобранному случаю. С той лишь разницей, что $val = $resp->value() - это не массив в привычном понимании этого слова. Это переменная XML_RPC_Value, а доступ к элементам массива должен осуществляться при помощи метода arraymem(). Например, $val->arraymem(0) вернет переменную XML_RPC_Value элемента с нулевым индексом. В нашем случае это - структура с информацией о ботах. Получить конкретные значения полей можно следующим образом: $val->arraymem(0)->structmem("ip")->scalarval().

[выводы]

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

Если же ты на дух не переносишь объектный подход, советую обратиться к другим реализациям XML_RPC. Информацию о них ты найдешь в соответствующей врезке. Все напечатанные в статье скрипты, дополненные и дописанные, оформленные в виде полноценного тестового примера, ты отыщешь на нашем диске. Там же найдется масса документации, а также все упомянутые в статье реализации XML_RPC.

Назад на стр. 083-124-4  Содержание  Вперед на стр. 083-124-6