Ciao,
sono riuscito a creare un cron job con Yii.
scrivo di seguito la mia procedura nell’intento di aiutare qualche eventuale futuro bisognoso
step 1) Modifica del file di configurazione console.php, questo file è escludendo particolari configurazioni personalizzate, il punto di riferimento di tutte le configurazioni dei comandi da console che si vogliono creare con Yii
// This is the configuration for yiic console application.
// Any writable CConsoleApplication properties can be configured here.
return array(
//*** parametro essenziale
'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
//*** parametro essenziale
'import'=>array(
'application.components.*',
'application.models.*',
),
//*** parametro essenziale
'components'=>array(
//*** diciamo a Yii che esiste un componente di nome alert...
//*** NB: è necessario inserire questa direttiva qui e non
//*** sul config/main dell'Applicazione, perchè config/main.php
//*** non viene letto seguendo questo flusso
'alert'=>array(
'class'=>'AlertComponent'
),
//*** chiamando console.php si inizializzano le info del DB
'db'=>array(
'class'=>'CDbConnection',
'connectionString' => 'mysql:host=localhost;dbname=nome_del_db',
'emulatePrepare' => true,
'username' => 'username',
'password' => 'password',
'charset' => 'utf8',
)
)
);
step 2) Ho creato i lfile che verrà chiamao dalla crontab di linux, questo file è un "semplice" file contenente PHP puro, poi ovviamente sta a noi importare il framework di Yii…ovviamente
<?php
defined('YII_DEBUG') or define('YII_DEBUG',true);
//*** inclusione del framework
require_once move_up_by_aronne(__DIR__,3).'/framework/yii.php';
//*** definizione del path del file console.php che ho usato per
//*** configurare il comando (sarebbe myApp/protected/config/console.php)
$url_file_config = dirname(__DIR__).'/config/console.php';
//*** creazione ed esecuzione dell'applicazione console
Yii::createConsoleApplication( $url_file_config )->run();
/**
* Funzione che in base ai livelli espressi risale un path
* $path: stringa contenente il path
* $lvls: numero di livelli da risalire nel path passato
*/
function move_up_by_aronne($path='', $lvls = 1){
$path_parts = explode('/', $path);
$path_chunk = array_chunk($path_parts, count($path_parts)-$lvls);
return implode('/', $path_chunk[0]);
}
?>
step 3) Ho creato la classe AlertCommand (nb.‘alert’ è il nome del comando da console, e infatti Alert è il nome della classe)
<?php
class AlertCommand extends CConsoleCommand {
public function run( $args=NULL ){
//*** la chiamata all'oggetto "alert"
//*** avvia l'esecuzione implicita del metodo "init()"
//*** contenuto obbligatoriamente nella classe "AlertComponent"
Yii::app()->alert;
}
}
?>
step 4) Creo un component di Yii che ho usato giusto per fare l’acesso al DB
class AlertComponent extends CComponent {
/**
* Questo esempio esegue un "brutale" inserimento in una tabella del DB
*/
public function init(){
$link = mysqli_connect('localhost','username','password','nome_del_db');
$query = "insert into 00_test values(null,concat('Alert cron: ', now())) ";
mysqli_query($link, $query);
mysqli_close($link);
}
}
step 5) creazione della chiamata schedulata nel crontab, praticamente gli sto dicendo a linux di eseguire il comando "alert" contenuto nello script .../cron.php ogni 2 minuti(*/2 significa proprio ogni2minuti)
*/2 * * * * php /var/www/html/<myApp>/protected/components/cron.php alert>/dev/null 2>&1
Questa procedura a me funziona, spero possa essere utile a qualc1 in futuro,
se trovate errori, miglioramenti da fare etc etc dite pure!..stiamo qui per questo!
Ciao