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

Qwench: versión opensource de StackOverflow

Qwench es una versión opensource de StackOverflow, para que nos la podamos descargar e instalar en nuestro servidor.

Entre las características que ofrece nos encontramos con:

  • Permite a los usuarios escribir preguntas y respuestas
  • Sistema de puntos similar a StackOverflow
  • Posibilidad de escribir artículos de conocimiento básico
  • Posibilidad de restringir el acceso a usuarios registrados únicamente
  • Layout CSS
  • Funciona en la mayoría de los navegadores

Qwench

XHProf: alternativa a XDebug desarrollada por Facebook

XHProf es una librería de PHP desarrollada por Facebook y liberada en marzo de 2009 que nos facilita el debug en nuestras aplicaciones.

Los datos que devuelve son muy interesantes:

  • Número de llamadas de una función a otra
  • Tiempo de ejecución de una función cuando es llamada desde otra
  • Tiempo de CPU de una función cuando es llamada desde otra
  • Diferencia en el uso de memoria de PHP en una función cuando es llamada desde otra

Una alternativa a XDebug muy interesante.

XHProf

Igbinary: serializador avanzado para PHP

Igbinary es una librería (necesita ser instalada) que sustituye el serialize de PHP comprimiendo las estructuras PHP en datos binarios. Tiene ratios de compresión mucho más altos, aunque en tamaños pequeños es más lento que el serialize original.

Permite los mismos tipos de datos que el serializer de PHP: null, bool, int, float, string, array y objetos.

Igbinary

Simular paquetes en PHP

Interesante script que nos permite cargar paquetes al estilo Java desde PHP. Aunque ya existen los phar, que es un paquete de PHP, esto puede resultar una posibilidad o al menos un método a tener en cuenta para importar varios archivos simultáneamente.

read())) 
        {
            /* Reject parent, current directories and sub directories */
            if(($file == '.')  ||
               ($file == '..') ||
               (is_dir($d->path . "/" . $file)))
            {
                continue;
            }
 
            require_once($basePath . $importFilePath . "/" . $file);
        }
    } else {
        /* If a single file is specified */
        $importFile = str_replace(".", "/", $classPath) . ".php";
    	require_once($basePath . $importFile);
    }
}
 
?>

Simulating Packages in PHP

Corrector ortográfico en PHP

No suele ser algo común que necesitemos un corrector ortográfico en nuestras aplicaciones web, pero por si alguien lo necesita, puede que este tutorial le venga bien.

El método es sencillo, obtenemos una lista de palabras en español (o el idioma que queramos) y la frecuencia con la que aparecen, para ello es bueno usar un libro o varios, obtener las palabras y calcular la frecuencia. Después, mediante la distancia Levenshtein, que nos devuelve el numero de letras que tenemos que modificar, insertar o borrar para que dos palabras sean las mismas, hacemos una lista de las palabras que los usuarios utilicen en nuestra aplicación (el buscador por ejemplo) y las palabras del diccionario, guardando solo aquellas relaciones que tengan una distancia 1 o 2.

Usando la lista con la relación entre palabras, cuando un usuario introduzca una palabra equivocada, le mostraremos las palabras que tengan una distancia 1 y si no hay, las que tengan una distancia 2.

Google, si mal no creo, a parte de este método lo que hace es controlar que palabras introducen los usuarios que no obtienen datos y las palabras que introduce después y que si obtienen datos.

Spelling Correction

Librería PHP para leer y escribir EPUB (eBooks)

Los libros electrónicos cada día están más de moda, y EPUB parece ser que será el formato que se convertirá en estándar para estos libros, algo que debemos tener en cuenta los desarrolladores para realizar exportación a este formato.

OPL’s EPUB library nos permite leer, escribir y editar los ficheros EPUB, la cual podemos usarla para crearnos un plugin de WP y exportar nuestras entradas o exportar los contenidos de nuestra web en este formato.

OPL’s EPUB library

Librería PHP para Google Analytics

Librería PHP que nos permite obtener los datos de Google Analytics tipo Visitas y Páginas Vistas de forma muy sencilla y cómoda:

//session_start for caching, if desired
session_start();
//get the class
require 'ga/analytics.class.php';
//sign in and grab profile
$analytics = new analytics('david@davidwalsh.name', 'myP@ssw0rd');
$analytics->setProfileByName('davidwalsh.name');
//set the date range for which I want stats for (could also be $analytics->setDateRange('YYYY-MM-DD', 'YYYY-MM-DD'))
$analytics->setMonth(date('n'), date('Y'));
//get array of visitors by day
print_r($analytics->getVisitors());
//get array of pageviews by day
print_r($analytics->getPageviews());

Google Analytics PHP API class

Vía / David Walsh Blog