Cron jobs problema con comandi custom

Ciao ragazzi,

ho dei problemi con la creazione di cron jobs schedulati…

creare un cron jobs con php puro mi è risultato abastanza semplice, crei il tuo file.php che vuoi che venga eseguito poi modifichi la crontab inserendone l’esecuzione schedulata e il gioco è fatto!..e infatti tutto funziona.

con Yii?…ho visto 3/4 tra topics tra tutorial, wiki e posts(è 1gg intero che giro per capire)…ma non mi è chiaro il procedimento ???

ho visto in alcuni casi che i file di configurazione del comando vengono salvati in console.php, altri casi in cui vengono salvati direttamente nel main.php, altri separatamente!..

ma se io avessi bisogno “semplicemente” di un comando che esegua una semplice insert sul db,qual’è il tutorial migliore da seguire?..

[size="4"][b]il mio vero problema è: come faccio a rendere visibile a Yii il mio nuovo comando?

[/b][size="2"]sò che devo mettere le mani in console.php ma le ho provate tutte…[/size][/size]

Grazie in anticipo a tutti!

Ciao,

sono riuscito a creare un cron job con Yii.

scrivo di seguito la mia procedura nell’intento di aiutare qualche eventuale futuro bisognoso ;D

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