Console Command

Ho un modulo (backend) in cui posso gestire delle parti dell’applicazione; Il problema sta qui: devo eliminare dei record e una cartella con delle immagini al loro interno…e singolarmente dal backend è tutto ok, ora tramite cronjob dovrei eliminare tutte le cartelle e i files,ed i dati del database…che hanno data odierna

La Parte del controller nel backend


private function recursiveRemove($dir) {

    $structure = glob(rtrim($dir, "/").'/*');

    if (is_array($structure)) {

        foreach($structure as $file) {

            if (is_dir($file)) recursiveRemove($file);

            elseif (is_file($file)) unlink($file);

        }

    }

    rmdir($dir);

}

	

	public function actionDelete($id)

	{


		$model=$this->loadModel($id);


		//elimino cartella e file

		$this->recursiveRemove(Yii::getPathOfAlias('webroot').'/images'.'/'.$model->nomecartella);


		$img_add = new GalleryImages();


	if ($img_add->gallery_id = $model->id) {


		//elimino le immagini figlie

		$img_add->deleteAllByAttributes(array(),'`gallery_id` = :delete',array(

    									':delete'=>$model->id,));





		//elimino offerta														

		$this->loadModel($id)->delete();

ora dovrei fare ciò anche tramite cronjob. nel command:




public function run($args)

    {

         // seleziono i record con la dataOdierna

         $offerte = Offerte::model()->findAllByAttributes(array('data_fin'=>date('Y-m-d')));


        foreach ($offerte as $del_offerte) {


        //elimino cartella e file

        $this->recursiveRemove(Yii::getPathOfAlias('webroot').'/images'.'/'.$del_offerte->nomecartella);




        

        }

         //Elimino i record dal database

    	Offerte::model()->deleteAllByAttributes(array(

         'data_fin'=>date('Y-m-d'),

    ));

																		





    }






Cosi facendo il cron mi elimina solo i record del database;è come se non mi riconoscesse la funzione per eliminare la cartella e i files…che è la stessa che ho nel controller della parte backend…ed eliminado uno ad uno funge!,

nel commando ho provato ad eseguire solo questa riga di codice

$this->recursiveRemove(Yii::getPathOfAlias(‘webroot’).’/images’.’/nomecartella’);

e non me la elimina!..quindi presumo che non veda la funzione del controller

anche perchè in questo caso…essendo privata…,$this… non va bene, ho provato ad implementare la funzione dichiarandola public…,ma niente

  1. pessima idea.

crea un componente che faccia il lavoro

usa il componente sia dal controller che dal console command.

in verità, anche se tutti sul web dicono di no, c’è davvero modo di eseguire una action da un console command, ma è altamente sconsigliabile.

  1. come detto in altro thread, aggiungi ai console command gli ini_set che visualizzino gli errori php !

Comunque sia, si fa così:

  1. Importa il controller. Nel mio caso ho specificato anche il nome del modulo perchè ne faccio uso

  2. Istanzia il controller

  3. Esegui la action o la function che vuoi




Yii::import('application.modules.order.controllers.ChargedController');

$orderController = new ChargedController("Charged"); 

$output = $orderController->actionGetReportOutput();



si avevo letto nell’altro trhead che mi consigliavi di creare un componente ed eliminare con lo shell_exec

proprio ora ho provato ad inserire la riga di codice nel command… dato che da terminale riuscivo ad eliminare la cartella;

nel command:


shell_exec(' rm -rf /var/www/vhosts/dominio/httpdocs/Applicazione/images/cartelladaeliminare')

eseguo il cron e non me la fa eliminare!

quindi la soluzione migliore è creare il componente?(ancora non ci ho provato a farne uno :D ), vorrei capire come agire per fare le cose “pulite”…se magari il problema si ripresentasse in futuro…saprei come “agire”

Dentro alla cartella component crei, per esempio, un file chiamato FileHelper.php




<?php


class FileHelper extends CApplicationComponent 

{

   public function rmDirRecursive($path) {

     ...

     return $boolean_esit;

   }

}



Dentro al config/main.php e al console.php dichiari il componente

Si noti che puoi ‘cambiargli il nome’, per esempio io per semplicità l’ho chiamato file.




...

// application components

'components'=>array(

        .....

        'file' 	=> array('class' 	=> 'FileHelper'), 

        .....

),

.... 



Accertati di aver importato, negli stessi file, la cartella components




'import'=>array(

		....

		'application.components.*',

                ..



Poi dove vuoi lo usi semplicemente così




$esit = Yii::app()->file->rmDirRecursive($path_to_remove)



E’ Andato tutto a buon fine!, dopo un bel pò di debug :D