Самопальный сервис 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. |