El Seudo Cron Jobs consiste en que cada vez que un usuario abra cualquiera de las páginas que componen nuestro website, lo primero que se haga sea verificar si alguna de las tareas programadas se cumplió y ejecutarla guardando la fecha y hora actual para que comience de nuevo el conteo.
Lo primero que hay que hacer es crear una tabla en la BD que se llame Cron:
Código MySQL:
Ver original
Luego se deben agregar las tareas que se quieran realizar, especificando cada cuanto se deben ejecutar (el intervalo debe estar en segundos):
Código MySQL:
Ver original
Reemplazar MiTarea por el nombre que le quieran dar a la tarea (no se pueden repetir) y 86400 por la cantidad de segundos que se deben completar (86400 corresponde a 24 hs).
Luego se debe crear un archivo llamado cron.php que va a contener el siguiente código:
Cron.php
Código PHP:
Ver original
<?php //Aquí la conexión a la BD, reemplazar por sus respectivos datos de conexión $mysqli = new mysqli(DB_SERVER, DB_USER, DB_PASS, DB_NAME); //Función para actualizar el TimeStamp de la última ejecución function ActualizarTime($dbID, $mySQL) { $sql= "UPDATE Cron SET Last='{$nowTime}' WHERE ID='{$dbID}'"; $result = $mySQL->query($sql); if ($result == false) echo "Se produjo un error al actualizar la tarea <br>"; return $result; } //Se seleccionan todas las tareas que estén registradas en la tabla $sql = "SELECT * FROM Cron"; if ($iNumReg > 0) { //Se recorre una a una las tareas while ($rowEmp = $result->fetch_assoc()) { $dbTime = $rowEmp['Last']; $dbInterval = $rowEmp['Intervalo']; $dbNombre = $rowEmp['Nombre']; $dbID = $rowEmp['ID']; //Se determina la diferencia de tiempo en segundos entre la última ejecución //y la fecha y hora actual $difTime = $nowTime - $dbTime; //Se determina si se cumplió el intervalo establecido en la tabla (en segundos) if ($difTime >= $dbInterval) { //Se determina la acción a realizar de acuerdo al Nombre de la tarea switch ($dbNombre) { case 'MiTarea': if (ActualizarTime($dbID, $mysqli) == true) { //Aquí va el código de la acción que se realizará al alcanzar //el tiempo establecido echo "Se ejecutó tarea {$dbID} con nombre {$dbNombre}<br>"; //La anterior línea se puede borrar, es sólo para verificación durante el debug } break; //Agregar tantos case como sean necesarios } } else { echo "Tarea {$dbID} tiempo {$difTime} de {$dbInterval} segundos.<br>"; //La anterior línea se puede borrar, es sólo para verificación durante el debug } } } ?>
Se deben colocar tantos Case como registros hayan en la tabla Cron y en cada case colocar el código de lo que se quiera realizar p ej verificar si hay registros a eliminar cada cierto tiempo o enviar un correo electrónico al administrador con alguna estadística, etc.
Por último agregar al principio del código de cada uno de los archivos php del website lo siguiente:
Código PHP:
Ver original
<?php include ("cron.php"); ?>
Así, cada vez que se abra una página se ejecutará el código de cron.php y si no colocan ningún echo (que es lo ideal) será completamente transparente para el usuario. Espero haya sido de ayuda.
PD: Se podría hacer una modificación, para en vez de agregar tantos Case se pueda llamar a una función desde un string. Para esto tendrían que agregar un nuevo campo a la tabla Cron de la BD que se llame Funcion que sea del tipo varchar y en ese campo escribir el nombre exacto de la función p ej MiFuncion. Luego colocar este código en cron.php en vez del anterior:
Código PHP:
Ver original
<?php //Aquí la conexión a la BD, reemplazar por sus respectivos datos de conexión $mysqli = new mysqli(DB_SERVER, DB_USER, DB_PASS, DB_NAME); //Aquí se colocarían las funciones que se quieran realizar function MiFuncion() { //Aquí va el código a ejecutar p ej enviar un correo echo "Se envió el correo<br>"; //Esta línea se puede borrar } //Función para actualizar el TimeStamp de la última ejecución function ActualizarTime($dbID, $mySQL) { $sql= "UPDATE Cron SET Last='{$nowTime}' WHERE ID='{$dbID}'"; $result = $mySQL->query($sql); if ($result == false) echo "Se produjo un error al actualizar la tarea <br>"; return $result; } //Se seleccionan todas las tareas que estén registradas en la tabla $sql = "SELECT * FROM Cron"; if ($iNumReg > 0) { //Se recorre una a una las tareas while ($rowEmp = $result->fetch_assoc()) { $dbTime = $rowEmp['Last']; $dbInterval = $rowEmp['Intervalo']; $dbNombre = $rowEmp['Nombre']; $dbFuncion = $rowEmp['Funcion']; $dbID = $rowEmp['ID']; //Se determina la diferencia de tiempo en segundos entre la última ejecución //y la fecha y hora actual $difTime = $nowTime - $dbTime; //Se determina si se cumplió el intervalo establecido en la tabla (en segundos) if ($difTime >= $dbInterval) { if (ActualizarTime($dbID, $mysqli) == true) { //Se llama a la función definida en la tabla Cron echo "Se ejecutó tarea {$dbID} con nombre {$dbNombre}<br>"; //La anterior línea se puede borrar, es sólo para verificación durante el debug } } else { echo "Tarea {$dbID} tiempo {$difTime} de {$dbInterval} segundos.<br>"; //La anterior línea se puede borrar, es sólo para verificación durante el debug } } } ?>
Cualquiera de las dos formas funcionan bien. Cualquier comentario es bienvenido o si hay alguna otra manera de hacerlo se aceptan aportes.