Laravel:从控制器调用Artisan命令工作不正常



当我遇到一条特殊的路由时,我正试图备份我的数据库。首先我制作了工匠命令:php artisan backupDB这是功能:

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;

我在cli中运行它,它运行得很好。然后当我试图通过控制器运行它时:

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

当我到达路线时,它会打印出回声,但没有发生其他事情。仅此而已。

所以,我找到了一个解决方案。将命令封装在作业中,或者只将代码放入该作业中,然后启动队列。通过这样做,当我试图达到路线时,代码工作得很好。

php artisan make:job backupDB

它将在应用程序内创建一个文件>作业文件夹然后将代码放入CCD_ 2函数中。

接下来只需调用控制器内的作业或路由

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

你需要设置队列,这是文档

您不需要重新发明轮子。只需使用此扩展即可。

PS:我无法解释你面临的问题,因为你没有提供任何调试信息:日志、回溯或类似的smth。

PS2:小心exec()函数使用