Desde hace varios dias andaba buscando como es que funciona lo de los pings via RPC-XML, vaya fue algo dificil encontrarlo pero ya se como esta esa onda.
Hace ya tiempo atras escuche de servicios como weblogs.com donde listan los ultimos blogs actualizados, solo que el metodo de actualizacion es mucho mas automatico ya que es posible hacerlo via XML-RPC. El ping via XML-RPC consite en una llamada a un procedimiento en un serividor remoto, a través del protocolo HTTP. Decide buscar mas hacerca del tema y encontre en el sitio web de la implementacion, la especificacion de como se realiza el proceso del ping en weblogs.com:
Lo que se debe hacer es una llamada a un procedimiento como este:
weblogUpdates.ping (weblogname, weblogurl, changesurl=weblogurl, categoryname=”none”) returns struct
donde:
- weblogname, es el nombre del blog
- weblogurl, es la url del blog.
- changesurl, es la url donde buscar nuevos cambios
- categoryname, es el nombre de la categoria del blog
los primeros 2 parametros son requeridos y todos son de tipo cadena. Esta funcion debe devolver 2 parametros, uno indicando si tuvo exito o no y el otro un mensaje descriptivo del error en inglés.
Este es un ejemplo de la comunicación entre el cliente (quien solicita el ping) y el servidor (quien buscará cambios en el blog):
POST /RPC2 HTTP/1.0
User-Agent: Radio UserLand/7.1b7 (WinNT)
Host: rpc.weblogs.com
Content-Type: text/xml
Content-length: 250
<?xml version=”1.0″?>
<methodCall>
|
<methodName>weblogUpdates.ping</methodName> |
|
<value>Scripting News</value> |
|
<value>http://www.scripting.com/</value> |
HTTP/1.1 200 OK
Connection: close
Content-Length: 333
Content-Type: text/xml
Date: Sun, 30 Sep 2001 20:02:30 GMT
Server: UserLand Frontier/7.0.1-WinNT
<?xml version=”1.0″?>
<methodResponse>
|
<value>Thanks for the ping.</value> |
Bueno y como se implementa un servidor XML-RPC en PHP? Me puese a buscar una librería escrita en php, para no tener que lidiar con un extensión para PHP que seria una solución mucho mas robusta, seria un poco más complicada de instalar en los servidores de hosting. Me tope con una implementacion del protocolo y en php: phpxmlrpc. Luego de una exporacion rápida, la libreria parecia muy completa y con unos 5 años de desarrollo… pero tambien bastante complicada para hacer algún servidor ping en un corto tiempo.
Para comprender mejor como se da esta comunicación en tiempo real, me di a la tarea de buscar en WordPress como se realiza esta función. Se que WordPress tiene la opcion de que cada vez que se realiza un nuevo post, este automáticamente envia el ping a las direcciones que se le han especificado. Despues de urgar mucho en el codigo y buscar en vano en codex.wordpress.com, encontre la función en functions.php:
function weblog_ping($server = '', $path = '') {
global $wp_version;
include_once (ABSPATH . WPINC . '/class-IXR.php');
// using a timeout of 3 seconds should be enough to cover slow servers
$client = new IXR_Client($server, ((!strlen(trim($path)) || ('/' == $path)) ? false : $path));
$client->timeout = 3;
$client->useragent .= ' -- WordPress/'.$wp_version;
// when set to true, this outputs debug messages by itself
$client->debug = false;
$home = trailingslashit( get_option('home') );
if ( !$client->query('weblogUpdates.extendedPing', get_settings('blogname'), $home, get_bloginfo('rss2_url') ) ) // then try a normal ping
$client->query('weblogUpdates.ping', get_settings('blogname'), $home);
}
Ya viendo esta funcion vi que primero intenan llamando a una funcion extendida del ping que donde le especifican la URL del feed ademas del nombre y la url del blog. Si esta funcion no es posible ejecutarla, entonces se llama a la version normal de ping, que solo toma 2 parametros: el nombre del blog y la URL del mismo. Tambien descubrí que incluyen el archivo class-IXR.php, que para sorpresa mia es una libreria que implementa el protocolo XML-RPC pero lo interesante es que contiene 2 clases: una cliente y otra servidor, esta última es la que me interesa. La libreria se llama IXR – The Inutio XML-RPC Library y su sitio oficial es: http://scripts.incutio.com/xmlrpc/.
En un vistazo rápido a la pagina de la librería encontré lo que estaba buscando, con un pequeño ejemplo se puede ver todo:
<?php
include('IXR_Library.inc.php');
function sayHello($args) {
return 'Hello!';
}
function addTwoNumbers($args) {
$number1 = $args[0];
$number2 = $args[1];
return $number1 + $number2;
}
$server = new IXR_Server(array(
'demo.sayHello' => 'sayHello',
'demo.addTwoNumbers' => 'addTwoNumbers'
));
Super sencillo! Bueno este es solo un ejemplo que dan ellos no se si funciona pero tengo grandes esperanzas de que sea algo de copiar & pegar y ya tenga mi servidor de ping XML-RPC funcionando.
Si este último código funciona, en unos dias estare poniendo este servicio en blogschapines para que le den una probadita….