【问题标题】:Laravel Download Database Tables in backgroundLaravel 在后台下载数据库表
【发布时间】:2018-05-13 23:12:35
【问题描述】:

我在 Laravel 中创建了命令,该命令从暂存服务器下载(复制)数据库的 .sql 文件并将其粘贴到生产服务器上(要求)。我没有对生产服务器的 SSH 访问权限,因此为该命令创建了路由并从 URL 执行它。这是我的代码。

路线

Route::get('console/import_all',
    function () {
    Artisan::call('importDatabase:staging', ['tables' => 'all']);
});

命令功能

private function downloadFile($url, $path)
{
    sleep(5);
    return copy($url, $path);
}

现在大约有 30 多个文件,其中一些文件的大小超过 10MB。我的命令在 SSH(由管理员)和 URL 中都可以正常工作。但问题是当我从 URL 中点击命令时,页面会一直加载直到所有下载完成。 有没有办法从后台执行此操作? 所以如果管理员从管理面板点击按钮,他/她不应该一直等到处理所有文件完成,我可以显示消息 流程已开始,完成后您会通知。

【问题讨论】:

    标签: php laravel laravel-5 ssh


    【解决方案1】:

    Laravel 为您的用例提供队列。

    https://laravel.com/docs/5.5/queues

    运行php artisan make:job DownloadFile

    然后在生成的类中调用artisan命令

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        Artisan::call('importDatabase:staging', ['tables' => 'all']);
    }
    

    然后在您的路线上派遣工作

    Route::get('console/import_all', function () {
        \App\Jobs\DownloadFile::dispatch();
    });
    

    【讨论】:

    • 谢谢@cwang,如果我遇到任何问题,我会尽力告诉你。
    • 面临错误“找不到类'DownloadFile'”我需要这样调用类吗? $DownloadFile = App\Jobs\DownloadFile::handle(); $DownloadFile::dispatch();
    • 使用 dispatch(new \App\Jobs\DownloadFile()) 工作正常;但是我怎么知道作业是否成功执行?
    • 不幸的是这里没有javascript promise风格的回调,你可以直接在handle方法中捕获异常,或者注册一个failed job event
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 2018-02-04
    • 2023-03-02
    相关资源
    最近更新 更多