IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Laravel PHP Discussion :

Créer un cron job


Sujet :

Laravel PHP

  1. #1
    Membre habitué Avatar de legrandse
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2010
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 350
    Points : 149
    Points
    149
    Par défaut Créer un cron job
    Bonjour à tous,


    J'essaye en vain d'exécuter une tâche toutes les 2 minutes.
    La tâche consiste à appeler une méthode d'un controlleur : IcalControlleur@read

    J'ai donc créé une commande dans laquelle j'appelle le controlleur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    namespace App\Console\Commands;
    
    use Illuminate\Console\Command;
    use App\Http\Controllers\IcalController;
    
    class RetrieveIcal extends Command
    {
        /**
         * The name and signature of the console command.
         *
         * @var string
         */
        protected $signature = 'command:name';
    
        /**
         * The console command description.
         *
         * @var string
         */
        protected $description = 'Command description';
    
        /**
         * Execute the console command.
         *
         * @return int
         */
        public function handle()
        {
    		$task = new IcalController();
    		$task->read();
        	
            return Command::SUCCESS;
        }
    }

    Et je fais appel à son exécution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    namespace App\Console;
    
    use Illuminate\Console\Scheduling\Schedule;
    use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
    
    
    
    class Kernel extends ConsoleKernel
    {
        /**
         * The Artisan commands provided by your application.
         *
         * @var array
         */
        protected $commands = [
            //
        ];
    
        /**
         * Define the application's command schedule.
         *
         * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
         * @return void
         */
        protected function schedule(Schedule $schedule)
        {
            
     $schedule->command('retrieveIcal')
                ->everyTwoMinutes();
         
        }
            
        
    
        /**
         * Register the commands for the application.
         *
         * @return void
         */
        protected function commands()
        {
            $this->load(__DIR__.'/Commands');
    
            require base_path('routes/console.php');
        }
    }

    Du coup j'ai un Fail de la tâche mais je ne sais pas ce qui ne fonctionne pas :
    Nom : Capture.PNG
Affichages : 473
Taille : 32,4 Ko

    Juste pour info le détail du controlleur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
     
    <?php
     
    namespace App\Http\Controllers;
     
    use Illuminate\Http\Request;
    use Illuminate\Support\Facades\DB;
     
    use Rogervila\ArrayDiffMultidimensional;
    use ICal\ICal;
    use App\Booking;
    use App\House;
    use App\HouseLinked;
     
    class IcalController extends Controller
    {
     
     
        public function read() {
        	//Récupère toutes les maisons
        	$house = House::all();
     
     
        	foreach($house as $houses){
     
        		//récupère les agences qui gèrent les maisons concernées et disposent d'un import ICAL
    			$agency = HouseLinked::managedHouses($houses->id) //retrieve managed houses by agencies
    	    						  ->where('import','!=',null) 
    	    						  //->where('agency_id',9)
    	    						  ->get();
     
     
    	    	foreach($agency as $agencies){
     
     
    						$ical = new ICal($agencies->import, array(
    					        'defaultSpan'                 => 2,     // Default value
    					        'defaultTimeZone'             => 'UTC',
    					        'defaultWeekStart'            => 'MO',  // Default value
    					        'disableCharacterReplacement' => false, // Default value
    					        'filterDaysAfter'             => null,  // Default value
    					        'filterDaysBefore'            => null,  // Default value
    					        'httpUserAgent'               => null,  // Default value
    					        'skipRecurrence'              => false, // Default value
    						    ));
    				    $events = $ical->eventsFromInterval('1 year');
     
    				   //events from ICAL
    				   //place les events dans un array en vue d'une comparaison
    						$a = array();
    						foreach ($events as $key => $event) {
    								$dtstart = $ical->iCalDateToDateTime($event->dtstart_array[3]);
    								$dtend = $ical->iCalDateToDateTime($event->dtend_array[3]);
    								$created = $ical->iCalDateToDateTime($event->created);
     
    				                $a[$created->format('Y-m-d H:i:s')] = [ //l'ID de l'array est un DateTime
    				                'start' => $dtstart->format('Y-m-d'),
    				                'end' => $dtend->format('Y-m-d'),
    				                'created' => $created->format('Y-m-d H:i:s'),
     
    				                ];
     
     
    						}
    						ksort($a); //trie l'array par ordre décroissant
     
     
    						//events already present in BDD
    						$data = Booking::select('arrival', 'departure','created_at')				
    							->where('house_id',$agencies->house_id)
    							->where('agency_id',$agencies->agency_id)
    							->orderBy('created_at', 'ASC')
    							->get()->toArray();
     
     
    						//place les events de la BDD dans un array en vue d'une comparaison
    						$b= array();	
    						foreach($data as $key=> $v){
    							$created = date('Y-m-d H:i:s',strtotime($v['created_at']));
     
    							$b[$created] = [ //l'ID de l'array est un DateTime
    							'start' => $v['arrival'],
    							'end' => $v['departure'],
    							'created' => $created,
    							];
    						}
    						ksort($b); //trie l'array par ordre décroissant
     
    				//dd($a,$b);
    				$insert = ArrayDiffMultidimensional::compare($a, $b);
    				//dd($insert);
    				$delete = 	ArrayDiffMultidimensional::compare($b, $a);
    				//dd($a,$b,$insert,$delete);	
     
     
     
     
    						foreach($insert as $key => $value){
     
     
    								Booking::updateOrCreate([
    								'arrival'=> $value['start'],
    								'departure' => $value['end'],
    								'house_id' => $agencies->house_id,
    								'agency_id' => $agencies->agency_id,
    								'status_id' => 2,
    								'event_id' => 1,
    								'customer_id'=> 1,
    								'created_at' => $value['created'],
     
    								]);
     
    						}
     
    						foreach($delete as $key => $value){
    								Booking::where('arrival',$value['start'])
    									->where('departure', $value['end'])
    									->where('house_id',$agencies->house_id)
    									->where('agency_id',$agencies->agency_id)
    									->delete();
     
     
    						}
     
     
        		}
     
     
        	}
     
        }
     
    }





    En vous remerciant pour l'aide

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 241
    Points
    20 241
    Par défaut
    Un controller attends une requête http.

    Si tu veux executer tout ou partie du code de la méthode read il faut la mettre ailleurs Par exemple dans App\Console\Kernel
    Tu ne peux pas simplement instancier le controller comme tu le fais

    Plus de détail ici : https://laravel.com/docs/9.x/scheduling

  3. #3
    Membre habitué Avatar de legrandse
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2010
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 350
    Points : 149
    Points
    149
    Par défaut
    Merci pour la précision.

    En effet, j'ai placé le code directement comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
     $schedule->call( function () {
    $house = House::all();
    etc...
     
    })->everyTwoMinutes();
    Cà fonctionne bien

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Créer un nouveau cron job via un script
    Par BEEP-BEEP dans le forum Shell et commandes GNU
    Réponses: 29
    Dernier message: 06/09/2020, 13h41
  2. Créer des CRON ?
    Par Seb33300 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 15/12/2008, 12h21
  3. [Quartz] Cron Job qui tourne en boucle
    Par K-Kaï dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 07/02/2008, 11h19
  4. Cron job sur un Pack perso confort 1&1 ?
    Par yazerty dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 25/09/2007, 18h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo