Libreria cron que utiliza ActiveRecord y librerias de Kumbia

edited junio 2010 in Dudas/Problemas
Buscando como realizar tareas programadas con cron me dí a la tarea de implementar una clase que dependa de kumbia, framework que me gusta muchísimo y pues aquí les dejo.

Les paso una librería que he creado, esta sirve para utilizarse desde un cron con esta clase puedes utilizar las librerías de Kumbia que son cargadas en el boot.ini.

Ademas utiliza tus Active Record, reconociendo los models de tu aplicación y con todas las maravillas del active record ya implementadas en kumbia utilizando tu archivo databases.ini.

No es nada nuevo es una implementación utilizando la misma lógica del core, espero les ayude y si se puede en algún momento implementarla en nuevas versiones.

Sirve para la beta 1 Spirit, que es donde programo. Saludos a todos.

La ubicación de la librería es la siguiente. Es importante para conservar los PATHS.

/kumbia/app/libs/cron/cron.php
<?php

/**
 * Define el APP_PATH
 *
 * APP_PATH:
 * - Ruta al directorio de la aplicación (por defecto la ruta al directorio app)
 * - Esta ruta se utiliza para cargar los archivos de la aplicación
 **/
define('APP_PATH', dirname(dirname(__FILE__)) . '/.././');


/**
 * Define el CORE_PATH
 *
 * CORE_PATH:
 * - Ruta al directorio que contiene el núcleo de Kumbia (por defecto la ruta al directorio core/kumbia)
 **/
define('CORE_PATH', dirname(APP_PATH) . '/../core/');


/**
 * @see KumbiaException
 */
require CORE_PATH . 'kumbia/kumbia_exception.php';

require CORE_PATH . 'kumbia/config.php';

/**
 * @see Flash
 */
require CORE_PATH . 'libs/flash/flash.php';
/**
 * @see Util
 */
require CORE_PATH . 'kumbia/util.php';


class Cron {
	
	protected static $_config ;
	
	public function __construct()
	{
		
		/**
		 * Lee la configuracion
		 */
		$this->_config = Config::read('config');
		
		/**
		 * Constante que indica si la aplicacion se encuentra en produccion
		 *
		 **/
		define('PRODUCTION', $this->_config['application']['production']);
		
		/**
		 * Carga la cache y verifica si esta cacheado el template, al 
		 * estar en produccion
		 *
		 **/
		if(PRODUCTION) {
		    /**
		     * @see Cache
		     **/
		    require CORE_PATH . 'libs/cache/cache.php';
		    /**
		     * Asigna el driver para cache
		     **/
		    if (isset($this->_config['application']['cache_driver'])) {
		        Cache::set_driver($this->_config['application']['cache_driver']);
		    } else {
		        Cache::set_driver('file');
		    }
		}
		/**
         * Si se utiliza base de datos
         **/
        if (! class_exists('Db', false)) {
            require CORE_PATH . 'libs/db/db.php';
        }
        $this->__all_models();
        
		$boot = Config::read('boot');
        if (!empty($boot['modules']['libs'])) {
            $libs = explode(',', str_replace(' ', '', $boot['modules']['libs']));
            foreach ($libs as $lib) {
                $this->lib($lib);
            }
            unset($libs);
        }
	}
	
	protected function __all_models($dir = null)
	{
		
		foreach (new DirectoryIterator(APP_PATH . "models/$dir") as $file) {
            if ($file->isDot() || $file->isDir()) {
                continue;
            }
            if ($file->isFile()) {
                include_once $file->getPathname();
                //if ($controller) {
                    $Model = Util::camelcase(basename($file->getFilename(), '.php'));
                    $this->$Model = new $Model();
                    //self::$_injected_models[] = $Model;
                //}
            }
        }
	}
	
	protected function lib($lib)
	{
        $file = APP_PATH . "libs/$lib.php";
        if (! is_file($file)) {
            $file = CORE_PATH . "libs/$lib/$lib.php";
            if (! is_file($file)) {
                throw new KumbiaException("$lib no encontrada");
            }
        }
        include_once $file;
	}

}

?>


La forma de implementar esta clase seria la siguiente, habrá que generar una clase que extienda de la clase cron y ahí generar los métodos que necesitemos, esto es util para no meter ruido a la clase y siguiendo un poco la filosofía de kumbia.

Un ejemplo
<?php


require_once 'cron.php';

class Ejemplo extends Cron{

    function hazAlgo(){
      //Aqui se implementa el codigo de la funcion ;)

      //Recuerden que tenemos acceso a los models por ejemplo

     $this->MiTabla->suMetodo();

     //Funciona igual que los controladores

     //También pueden utilizar las librerias cargadas en su boot.ini

     Logger::debug("Un debug desde Logger");
   }
}

$ejemplo = new Ejemplo();

$ejemplo->hazAlgo();
?>

Para ponerlo en el cron bastara algo como esto

0 1 1 * * www /usr/bin/php /path_server_web/kumbia/app/libs/cron/ejemplo.php

El usuario es www porque comúnmente es el dueño de lo que se encuentra debajo del servidor web. Este cron correrá el primer día de cada mes en su minuto cero de la primera hora del día.

Bueno aquí les dejo, si hacen mejoras por favor pasen la información a todos y a seguir programando con ñ.
Sign In or Register to comment.