15

I work with Laravel Task Scheduling, but I have a problem when I call some method from my controller.

protected function schedule(Schedule $schedule)
{
    $schedule->call('UserController@deleteInactiveUsers')->everyMinute();
    //$schedule->call('App\Http\Controllers\UserController@deleteInactiveUsers')->everyMinute();
}

When I call with uncommented line i get this error:

[ReflectionException]
Class RecurrenceInvoiceController does not exist

and then I insert fully qualified namespace path and then I get this error:

[PDOException] SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known

And

[ErrorException] PDO::__construct(): php_network_getaddresses: getaddrinfo failed: Name or service not known 

Where is the problem? Which way is correct to call method from Controller from Laravel Task Scheduling.

Kikolce
  • 181
  • 1
  • 1
  • 8

5 Answers5

40

I stumbled months ago with the same problem, until I could fix it. I use laravel 5.2 and the kernel call my drivers this way:

$schedule->call('App\Http\Controllers\MyController@MyAction')->everyMinute();

I hope this will help someone else ;)

Frits
  • 7,341
  • 10
  • 42
  • 60
  • @BinitGhetiya How did you add parameter option? – Salman Riyaz Mar 27 '20 at 07:15
  • although this answer solve the OP problem but i really think that the cron should call a service function not a controller one, i would put the logic you have in that controller function inside a service and i will call it from the controller and the cron – George Jun 06 '20 at 09:15
3

Directly put this in schedule function in kernel.php.

$schedule->call('App\Http\Controllers\YourController@function')->everyMinute();

This will run after every minute.

Note:

In localhost, you have to run it manually but on the server, you should try this command in your cronjob this will automatically call your controller function after every minute

php -d register_argc_argv=On /home/iflasity/public_html/foldername /artisan schedule:run > /dev/null 2>&1 

cd /home/iflasity/public_html/foldername && php artisan schedule:run /dev/null 2>&1 
francisco
  • 1,387
  • 2
  • 12
  • 23
1

For me, the first error looks like you need to run composer update, then composer dump-autoload.

If it works you will also get the second error, the 2002 error meaning is:

Can't connect to local MySQL server through socket" (see (Client Error Codes and Messages in MySQL docs).

You need to set your database configuration in your .env file

lcjury
  • 1,158
  • 1
  • 14
  • 26
  • Because controller is wrong way to use in scheduling task, I created artisan Command with same logic from my Controller. But now I don't gave any error message but don't work this functionality. Also I create route for this controller to test this code and code work perfectly, but there not. – Kikolce Mar 17 '16 at 08:48
  • My `.env` file is OK because I successfully inserted record in database from controller but from scheduling not working – Kikolce Mar 17 '16 at 09:26
1

OK. I solved this problem. The problem was with Docker Cron container. Cron container was not linked with MySQL container. Thanks for all answers.

Kikolce
  • 181
  • 1
  • 1
  • 8
0

Also now I test with more simple function to insert new currency in database. Here is code:

public function handle()
{
    $currency = new Currency();
    $currency->currency_name = 'EUR';
    $currency->save();

    $this->info('New currency is successfully generated!');
}

This function is from laravel/app/Console/Commands. I call from Kernel > schedule(). Not work.

When I insert simple log write to handle() function like:

File::put(base_path() . '/storage/logs/test_logs.txt', 'Test log ' . Carbon::now()->format('Y-m-d H:i:s') . PHP_EOL);

this works. But when I try to create new object from Models and save into db -> this not work.

francisco
  • 1,387
  • 2
  • 12
  • 23
Kikolce
  • 181
  • 1
  • 1
  • 8
  • I test this code row by row. First 2 row where I create new `Currency` object and add property `currency_name` is OK. But the error is on row 3, where I call save method. `$currency->save()` – Kikolce Mar 17 '16 at 10:23
  • 1
    This is not an answer, so, for proper use of stackoverflow you should edit your question and put any new information there, on the other hand your are adding a lot of blurry informatión, what are you trying to do? an artisan command? calling a controller? running a task? please! stick with one so we can work from something. – lcjury Mar 17 '16 at 14:51