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

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

eto'o

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


Первым делом установки PEAR-расширение XML_RPC:

$ pear install XML_RPC

Или можно просто руками скачать с сайта архив с нужными скриптами. Затем уже можно приступать к написанию серверной части нашего приложения. Любое описание сервиса всегда начинается с подключения файла Server.php, в котором находится описание всех необходимых нам служебных классов. Поскольку я не пользовался pear install, а просто скопировал исходники в папку со скриптом, то у меня это выглядит вот так:

require_once 'XML_RPC-1.4.3/Server.php';

Затем необходимо определить функцию, которая будет выполнять заданное действие - считать ботов, я назвал ее NumBots. Я приведу ее код и прокомментирую его чуть позже:

function NumBots($params) {

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

if (!XML_RPC_Value::isValue($param)) {

return $param;

}

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

$rn=mysql_num_rows($re);

$val = new XML_RPC_Value($rn, 'int');

return new XML_RPC_Response($val);

}

Легко понять, что $params - это переменная класса, получение параметров осуществляется при помощи метода getParam(). Затем происходит проверка на корректность полученных данных, составляется элементарный запрос, считается количество возвращенных записей, создается новая переменная класса XML_RPC_Value, а затем возвращается ответ сервера.

После описания процедуры необходимо создать экземпляр XML_RPC_Server и сопоставить символическому методу numberOfBots нашу функцию NumBots. Делается это так:

$server = new XML_RPC_Server(

array(

'numberOfBots' =>

array(

'function' => 'NumBots'

)

));

?>

Вот, в общем-то, и все :). Согласись, все чрезвычайно просто. Но чтобы придать законченность нашей системе, необходимо написать еще клиентскую часть. Первая строка у всех клиентов одинаковая, нужно подключить файл RPC.php:

require_once 'XML_RPC-1.4.3/RPC.php';

Затем из передаваемой GET'ом переменной $_GET[date_r] нужно сделать массив переменных XML_RPC_Value:

$params = array(new XML_RPC_Value($_GET[date_r], 'string'));

Обрати внимание, что конструктор этого класса первым параметром принимает сами данные, а во втором указывается тип - в нашем случае - строка string. После этого создается RPC-сообщение, которое вызывает метод, передавая ему параметры $params:

$msg = new XML_RPC_Message('numberOfBots', $params);

Затем необходимо создать клиента и отослать наше сообщение:

$cli = new XML_RPC_Client('/te/se.php', 'ired.inins.ru');

$resp = $cli->send($msg);

После этого происходит обработка ошибок:

if (!$resp) {

echo 'Ошибка связи:' . $cli->errstr;

exit;

}

if (!$resp->faultCode()) { # Не случилось ошибок

$val = $resp->value();

echo 'За '.$_GET[date_r].' зарегистрировано '.$val->scalarval().' ботов';

} else {

echo 'Код ошибки: ' . $resp->faultCode() . "\n";

echo 'Причина ошибки: ' . $resp->faultString() . "\n";

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