Glyde: proxy PHP para descargas directas

Glyde es un script proxy PHP, el cual podemos instalarlo en nuestro servidor pudiendo acceder a URLs que tenemos capadas ya sea en nuestra oficina o por la nueva ley que se ha inventado la ministra para lo de las páginas de enlaces (en este caso nuestro servidor no podrá estar en España, lógicamente).

Entre las características que ofrece nos encontramos con:

  • Muy fácil de instalar, tan sólo hay que copiarlo y ya funciona
  • URLs encriptadas
  • Bloqueo de IPs (aunque yo casi le metería protección por htaccess)
  • Caché en el servidor
  • Soporte de Javascript
  • Panel de administración

Glype

Evitar ejecuciones múltiples en cron con PHP

Cuando tienes una aplicación web, los procesos cron son muy útiles para automatizar tareas de todo tipo: mantenimiento, background, … El problema que nos podemos encontrar es cuando el tiempo que tarda en ejecutarse un cron supera el tiempo de espera entre ejecuciones, con lo que nos encontramos con dos cron ejecutándose en el mismo momento, pudiendo repercutir negativamente en la propia tarea del cron.

Para evitar esta situación, el script al que hago referencia nos va a venir muy bien, porque añade bloqueos al cron para evitar que dos procesos se ejecuten. Una solución sencilla es crear un fichero, y si el fichero existe, pues no ejecutar el cron. El problema que tiene esto es que si el cron termina abruptamente, el fichero seguirá existiendo por no haberse borrado y el resto de procesos cron no se ejecutarán.

El autor en este script añade la posibilidad de saber si el cron sigue ejecutándose o se terminó incorrectamente, para lo cual en el fichero de bloqueo guarda el PID del proceso cron que lo crea y comprueba si el PID sigue existiendo. Este script sólo es útil en entornos linux.

How to use locks in PHP cron jobs to avoid cron overlaps

Vía / PHPDeveloper.org

Hacks para CodeIgniter

Ya he mencionado anteriormente que CodeIgniter me parece el mejor framework PHP que hay, por lo que considero que los hacks a los que hace referencia el artículo de Nettuts nos pueden venir muy bien a quienes usamos CI:

  • Autoload de modelos
  • Prevenir colisión de nombres de controladores y modelos
  • Validación de formularios con valores únicos
  • Ejecutar CI desde la línea de comandos
  • Usar CI para múltiples sitios
  • Permitir cualquier tipo de ficheros a la hora de subir ficheros

6 CodeIgniter Hacks for the Masters

Laboratorio: Twitter trends

Mi amigo Christian me ha comentado que la entrada anterior sobre Twitter sería más interesante si mostrara los datos sobre un término.

Pues dicho y hecho, tan sólo se necesitan dos scripts, uno para recuperar los datos y otro para mostrarlos. El primero habrá que ponerlo en el cron para que recupere los datos cada cierto tiempo (en mi ejemplo busco “google” cada 2 minutos).

Hay que tener cuidado porque Twitter da un máximo de 2000 actualizaciones nuevas, por lo que tendremos que ajustar los tiempos de consulta en Twitter.

El script que lee los datos es el siguiente:

<? php

function insertar($consulta, $ult) {
  global $db;

  $data = json_decode(file_get_contents('http://search.twitter.com/search?q='.urlencode($consulta).'&refresh=true&since_id='.$ult));
  $n = isset($data->total) && $ult != $data->max_id? $data->total:0;
  $db->queryExec('INSERT INTO estadisticas (fecha, n) values ('.time().', '.$n.')');
  if (!$ult) $db->queryExec("INSERT INTO opciones (clave, valor) values ('ultimo', ".$data->max_id.")");
  else $db->queryExec("UPDATE opciones SET valor = ".$data->max_id." where clave='ultimo' ");
}

$consulta = $_GET['q'];
// Limpio para poder usarlo en el nombre para la BD
$_consulta = preg_replace('/[^A-Z0-9]/i', '_', $consulta);

if ($db = new SQLiteDatabase($_consulta.'.db')) {
  $q = @$db->query("SELECT valor FROM opciones Where clave='ultimo'");
  if (!$q) {
    $db->queryExec('CREATE TABLE estadisticas (fecha real, n real, PRIMARY KEY (fecha));');
    $db->queryExec('CREATE TABLE opciones (clave text, valor text, PRIMARY KEY (clave));');
    $q = $db->query("SELECT valor FROM opciones Where clave='ultimo'");
  }
  $r = $q->fetchAll(SQLITE_ASSOC);
  $ult = 0;
  if (!empty($r)) $ult = $r[0]['valor'];
  insertar($consulta, $ult);
}
?>

Y el script que dibuja la gráfica es:

<? php
$desde = strtotime($_GET['desde']);
$hasta = strtotime($_GET['hasta']);

$consulta = $_GET['q'];
// Limpio para poder usarlo en el nombre para la BD
$_consulta = preg_replace('/[^A-Z0-9]/i', '_', $consulta);

if ($db = new SQLiteDatabase($_consulta.'.db')) {
  $q = $db->query("SELECT fecha, n FROM estadisticas Where fecha>".$desde." and fecha<".$hasta);
  $r = $q->fetchAll(SQLITE_ASSOC);
  foreach($r as $item) {
    $x[] = $item['n'];
    $l[] = $item['fecha'];
  }
}

header('Location: http://chart.apis.google.com/chart?chtt=Line+Chart&chts=000000,12&chs=1000x600&chf=bg,s,ffffff|c,s,ffffff&chxt=x,y&chxl=0:|'.implode('|', $l).'|1:|'.implode('|', $x).'&cht=lc&chd=t:75.00,16.66,0.00,8.33,100.00&chdl=Label+1&chco=0000ff&chls=1,1,0');

Actualización: Google Charts no deja meter muchos valores por lo que la gráfica de arriba sólo saca las 20 últimas actualizaciones

Librería OAuth para Twitter

Twitter OAuth PHP Class es una librería que nos vendrá muy bien para poder utilizar el API de Twitter usando OAuth, método de autenticación que no necesita que el usuario registre su usuario/contraseña en otras aplicaciones.

Un ejemplo de uso sería el siguiente:

$to = new TwitterOAuth($consumer_key, $consumer_secret);
$tok = $to->getRequestToken();
$request_link = $to->getAuthorizeURL($token);
$tok = $to->getAccessToken();
$to = new TwitterOAuth($consumer_key, $consumer_secret, $user_access_key, $user_access_secret);
$content = $to->OAuthRequest('https://twitter.com/account/verify_credentials.xml', array(), 'GET');
$content = $to->OAuthRequest('https://twitter.com/statuses/update.xml', array('status' => 'Test OAuth update. #testoauth'), 'POST');

Twitter OAuth PHP Class

Vía / PHPDeveloper.org

Libpuzzle: librería para encontrar imágenes similares

Libpuzzle es una librería para Linux que permite conocer el porcentaje de similitud entre dos imágenes. Además aporta una extensión para PHP que nos permitirá realizar aplicaciones web que comparen imágenes.
Da algunos falsos positivos, pero si se toquetea la configuración se puede solucionar.
Libpuzzle

Usar SQLite desde CodeIgniter

SQLite es una posibilidad a tener en cuenta cuando no es posible realizar aplicaciones web que accedan a una BD (MySQL, Oracle, …), ya que no existe servidor de BD sino un conjunto de rutinas y los datos se guardan en un fichero en el servidor.
Para aquellos que programen con CodeIgniter les podrá venir muy bien esta explicación para integrar CI y SQLite.
CodeIgniter PDO SQLite3 quick setup

PHP Obfuscator: ofusca tu código PHP

PHP Obfuscator es una aplicación para Windows que permite ofuscar el código PHP de tus aplicaciones. ¿Para qué nos puede ser útil? para vender una aplicación a un cliente y que éste no realice las modificaciones que pueda solicitarnos a nosotros ya que el código será ilegible.
PHP Obfuscator