Idris Akbar Adyusman
Idris Akbar Adyusman

Reputation: 314

Laravel: Calling Artisan command from controller not working properly

I'm trying to backup my db when I hit a spesific route. first I made artisan command: php artisan backupDB here is the function:

    echo "Generating backup file..\n";
    $filename = "backup-" . Carbon::now()->format('Y-m-d-H-i-s') . ".sql";
    $command = "mysqldump --user=" . env('DB_USERNAME') ." --password=" . env('DB_PASSWORD') . " --host=" . env('DB_HOST') . " " . env('DB_DATABASE') . " > " . storage_path() . "/app/backup/" . $filename;
    
    $returnVar = NULL;
    $output  = NULL;
    
    exec($command, $output, $returnVar);
    echo "Backup file path: ".storage_path() . "/app/backup/".$filename;

I run it in cli and it is working fine. then when I tried to run it via controller:

  use Illuminate\Support\Facades\Artisan;

  public function backupDB{
     Artisan::call("backupDB");
  }

when I hit the route it prints the echo, but nothing else happened. just that.

Upvotes: 2

Views: 922

Answers (2)

Idris Akbar Adyusman
Idris Akbar Adyusman

Reputation: 314

So, I found a solution. wrap the command inside a job or just put the code inside that job, and then start the queue. By doing that the code works fine when I try to hit the route.

 php artisan make:job backupDB

it will create a file inside app>jobs folder then put the code inside handle() function.

next just call the job inside your controller or route

use App\Jobs\backupDB;

public function backup()
{
    $process = new pull();
    dispatch($process);
}

and you need to setup the queue, here is the docs

Upvotes: 1

Denis Kovalev
Denis Kovalev

Reputation: 21

You don't need to reinvent the wheel. Just use this extension.

PS: I can't explain the problem you are facing, because you didn't provide any debug info: logs, backtrace, or smth like that.

PS2: Be careful with exec() functions usage

Upvotes: 0

Related Questions