En PhalconPHP al igual que otros frameworks podemos crear una tarea programada o cron que se ejecuta dentro del propio framework. Vamos con los primeros pasos.
Crear el archivo cli.php en la carpeta app. Además ya se va a meter en ese archivo la injección de la db para poder hacer queries y el registro de la carpeta models. Así evitamos el fallo si hacemos un consulta y no tenemos el servicio inyectado. El fallo que podrías ver es:
Service 'db' wasn't found in the dependency injection container
El archivo cli.php
<?php
use Phalcon\Di\FactoryDefault\Cli as CliDI;
use Phalcon\Cli\Console as ConsoleApp;
use Phalcon\Loader;
// Using the CLI factory default services container
$di = new CliDI();
/**
* Register the autoloader and tell it to register the tasks directory
*/
$loader = new Loader();
$loader->registerDirs(
[
__DIR__ . '/tasks',
__DIR__ . '/models'
]
);
$loader->register();
// Load the configuration file (if any)
$configFile = __DIR__ . '/config/config.php';
if (is_readable($configFile)) {
$config = include $configFile;
$di->set('config', $config);
}
// Create a console application
$console = new ConsoleApp();
$console->setDI($di);
/**
* Database connection is created based in the parameters defined in the configuration file
*/
$di->setShared('db', function () {
$config = $this->getConfig();
$class = 'Phalcon\Db\Adapter\Pdo\\' . $config->database->adapter;
$params = [
'host' => $config->database->host,
'username' => $config->database->username,
'password' => $config->database->password,
'dbname' => $config->database->dbname,
'charset' => $config->database->charset
];
if ($config->database->adapter == 'Postgresql') {
unset($params['charset']);
}
$connection = new $class($params);
return $connection;
});
/**
* Process the console arguments
*/
$arguments = [];
foreach ($argv as $k => $arg) {
if ($k === 1) {
$arguments['task'] = $arg;
} elseif ($k === 2) {
$arguments['action'] = $arg;
} elseif ($k >= 3) {
$arguments['params'][] = $arg;
}
}
try {
// Handle incoming arguments
$console->handle($arguments);
} catch (\Phalcon\Exception $e) {
// Do Phalcon related stuff here
// ..
fwrite(STDERR, $e->getMessage() . PHP_EOL);
exit(1);
} catch (\Throwable $throwable) {
fwrite(STDERR, $throwable->getMessage() . PHP_EOL);
exit(1);
} catch (\Exception $exception) {
fwrite(STDERR, $exception->getMessage() . PHP_EOL);
exit(1);
}
Ahora dentro de app creamos una carpeta llamada tasks que será dónde podremos nuestra tarea para ejecutar. Aquí pongo un ejemplo.
<?php
use Phalcon\Cli\Task;
class MainTask extends Task
{
public function mainAction()
{
$usuarios = Usuarios::find();
foreach ($usuarios as $usuario) {
echo $usuario->id;
}
}
}
Ahora para ejecutar la tarea, desde un terminal en la carpeta raiz del proyecto, ponemos lo siguiente:
php app/cli.php Main main
Ahora ya puedes crear un cron desde la terminal de linux para ejecutarlo a la hora que quieras.