Deteccion de peso de archivos por RSSComo lo prometido es deuda aqui va una aplicación directa de la anterior funcion linksHTML().
Contra todo pronostico, no.. no voy a hacer un robot de búsqueda que compita con google y yahoo en búsquedas en internet... mas que nada xq aruba no da para tanto en bases de datos :P voy a hacer algo que seguro que muchos también encuentran de utilidad.
Que soy un adicto a las series no es un secreto.. de echo el ago que muchos saben por el twitter, y mi dilema esta en tener que mirar periodicamente webs como tusseries.com revisando serie por serie para saber si existe un nuevo capitulo ya que no tiene RSS como muchas otras.
Utilizando la función linksHTML() y una función que ahora expondré voy a construir un sistema simple que nos genere un RSS para avisarnos de si una web ha cambiado o no.

La función que va a obrar este milagro es la función rssPeso().
Lo que hace esta función es leer el archivo introducido como primer parámetro, utilizar lo leído para determinar el numero de caracteres que tiene y por tanto el peso del archivo y guardar este dato en un archivo dentro del servidor . Tiene una función adicional que permite ponerle un array de extensiones que verificar, cosa para la que se usa la función linksHTML() y que vale para verificar si algún archivo en lazado desde la web ha cambiado también aunque siga conservando el mismo nombre (como pasa por ejemplo en algunos sistemas de transmisión de capturas de cámara online o cambios de archivos o contenidos flash). El tercer parámetro indicará la carpeta en la que se quiere guardar los archivos temporales que guardan el peso especifico del archivo.

Para el primer ejemplo hay que crear un archivo que se llame rssPeso.php y poner el siguiente contenido (con las funciones arriba comentadas incluida la del final lógicamente)..
Este ejemplo registrara los cambios en la pagina principal de flickr sin alertar cuando se cambie aleatoriamente sus gráficos.

PHP:
  1. <?php
  2.     $url = 'www.flickr.com';
  3.     rssPeso($url);
  4. ?>

El siguiente ejemplo avisa no solo de cuando cambie el contenido de la pagina de google si no que también cuando cambie su imagen.

PHP:
  1. <?php
  2.     $url = 'www.google.es';
  3.     rssPeso( $url, array('gif', 'png', 'jpg', 'jpeg') );
  4. ?>

El ultimo ejemplo es como el anterior solo que almacena los datos temporales en la carpeta "temp" del mismo directorio.

PHP:
  1. <?php
  2.     $url = 'www.google.es';
  3.     rssPeso( $url, array('gif', 'png', 'jpg', 'jpeg'), 'temp' );
  4. ?>

Cualquiera de los ejemplos necesita de las funciones linksHTML() y rssPeso() para funcionar. Para ver el resultado solo hay que introducir la dirección del archivo PHP en un lector de RSS.

La función es:

PHP:
  1. function rssPeso($url, $extensiones_a_revisar='', $carpeta_contenidos='./'){
  2.    
  3.     $peso_total = 0;
  4.    
  5.     //deteccion de http
  6.     $url = substr($url, 0, 7) == 'http://' ? $url : 'http://'.$url;
  7.    
  8.     //detectar enlaces
  9.     $enlaces    = linksHTML($url);
  10.     if($enlaces['error']) return array('error' => $enlaces['error']);
  11.    
  12.     //apilar contenidos adjuntos
  13.     if(is_array($extensiones_a_revisar)){
  14.         foreach($extensiones_a_revisar as $ext){
  15.             if(is_array($enlaces[$ext]))    foreach($enlaces[$ext] as $URL) $peso_total += strlen(file_get_contents($URL));
  16.         }
  17.     }
  18.     $contenido   = @file_get_contents($url);
  19.     $peso_total += strlen($contenido);
  20.    
  21.     //determinar si son diferentes al tamanio anterior
  22.     $read = @file_get_contents($carpeta_contenidos.'/'.base64_encode($url).'.cache');
  23.     if($read != $peso_total) {
  24.         //escribir el tamanio actual en el archivo
  25.         $fp  = fopen ( $carpeta_contenidos.'/'.base64_encode($url).'.cache','w+' );
  26.         $read   = fwrite( $fp, $peso_total, strlen($peso_total) );
  27.         fclose($fp);
  28.     }
  29.  
  30.     //crear RSS
  31.     // Header para escribir XML
  32.     header('Content-type: text/xml; charset="iso-8859-1"', true);
  33.    
  34.     //titulo de la pagina web
  35.     preg_match_all("!<title>(.+)</title>!U",$contenido,$titulo);    $titulo = $titulo[1][0] == '' ? $url : $titulo[1][0];
  36.    
  37.     // Escribimos el archivo RSS
  38.     echo '<?xml version="1.0" encoding="iso-8859-1"?>
  39. <rss version="0.92">
  40.     <channel>
  41.         <docs>'.__FILE__.'</docs>
  42.         <title>Detector de cambios RSS</title>
  43.         <link>'.$url.'</link>
  44.         <generator>www.tierra0.com</generator>
  45.         <description>Detector de cambios RSS</description>
  46.         <language>es</language>
  47.        
  48.         <item>
  49.             <title>'.$titulo.' - '.$peso_total.'Bytes</title>
  50.             <link>'.$url.'</link>
  51.             <pubDate>'.date("j/m/y h:i", filemtime($carpeta_contenidos.'/'.base64_encode($url).'.cache')).'</pubDate>
  52.             <description>El archivo cambio la ultima vez el '.date("j/m/y h:i", filemtime($carpeta_contenidos.'/'.base64_encode($url).'.cache')).'. Ahora tiene '.$peso_total.'Bytes, '.($peso_total-$contenido).'Bytes mas que antes.</description>
  53.             <!--ng:token>'.base64_encode(date("j/m/y h:i", filemtime($carpeta_contenidos.'/'.base64_encode($url).'.cache'))).'</ng:token-->
  54.         </item>
  55.     </channel>
  56. </rss>';
  57. }

Los usos para esta función son solo limitados por la imaginación de cada uno.. se puede utilizar para detectar cuando sale una subvención, cuando cambia un horario, cuando se actualiza un dato introduciendo una pagina de búsqueda como variable o como medio para actualizar terceros códigos PHP... Si encontráis mas usos o correcciones ya sabéis donde escribirlas ;) !