0

我有一个使用 Laravel 5.8 框架构建的 API REST。

我必须从公共 REST API 获取我的应用程序的数据。为此,我必须做很多请求。我做了一个播种机做什么,整个迁移数据过程大约需要 2 分钟(从公共 Api 获取并插入我的应用程序数据库)。

我无法通过 cronjob 运行播种机,因为它不起作用(看起来需要用户执行命令才能工作)。因此,我创建了一个从内核文件调用的作业类,队列配置设置为QUEUE_CONNECTION=database数据库( -配置)。

尽管如此,作业还是失败了,因为执行需要很长时间,所以我的数据没有更新。

我能做些什么成功地批量处理我的工作?

这是我的 kernel.php

<?php

namespace App\Console;

use App\Jobs\Seed\ApiPlayerStatisticJob;

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->job(new ApiPlayerStatisticJob)->everyFiveMinutes();
    }

    /**
     * Register the commands for the application.
     *
     * @return void
     */
    protected function commands()
    {
        $this->load(__DIR__.'/Commands');

        require base_path('routes/console.php');
    }
}

我的 ApiPlayerStatisticJob.php

<?php

namespace App\Jobs\Seed;

use App\ApiExternal;
use App\ApiPlayer;
use App\ApiTeam;

use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;

class ApiPlayerStatisticJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        $api_teams = ApiTeam::get();
        foreach ($api_teams as $api_team) {
            // echo 'TEAM: '.$api_team->id;
            $api_external_players = ApiExternal::getTeamPlayerStatistics($api_team->id);
            foreach ($api_external_players as $api_external_player) {
                // echo PHP_EOL.'PLAYER: '.$api_external_player['id'];
                $api_player = ApiPlayer::find($api_external_player['id']);
                if ($api_player != null) {
                    $api_player->update($api_external_player);
                    // echo PHP_EOL.'> PLAYER UPDATED ';
                } else {
                    // echo PHP_EOL.'X PLAYER DIDNT UPDATED ';
                }
            }
            // echo PHP_EOL;
            // echo PHP_EOL;
        }
    }
}

还有我用来构建工作的播种机(通过复制,不包括打印表达式):

<?php

use Illuminate\Database\Seeder;

use App\ApiExternal;
use App\ApiPlayer;
use App\ApiTeam;

class ApiPlayerStatisticsSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $api_teams = ApiTeam::get();
        foreach ($api_teams as $api_team) {
            echo 'TEAM: '.$api_team->id;
            $api_external_players = ApiExternal::getTeamPlayerStatistics($api_team->id);
            foreach ($api_external_players as $api_external_player) {
                echo PHP_EOL.'PLAYER: '.$api_external_player['id'];
                $api_player = ApiPlayer::find($api_external_player['id']);
                if ($api_player != null) {
                    $api_player->update($api_external_player);
                    echo PHP_EOL.'> PLAYER UPDATED ';
                } else {
                    echo PHP_EOL.'X PLAYER DIDNT UPDATED ';
                }
            }
            echo PHP_EOL;
            echo PHP_EOL;
        }
    }
}

最后,静态函数ApiExternal::getTeamPlayerStatistics(int id)执行所有请求以获取数据(如 30 个请求),那么我可以做些什么来在后台处理这项工作(或直接播种器)而不会失败?

4

1 回答 1

0

您是否正确配置了config/queue.php文件?

引用Job expires段落中的文档:

在您的 config/queue.php 配置文件中,每个队列连接都定义了一个 retry_after 选项。此选项指定队列连接在重试正在处理的作业之前应等待的秒数。

于 2019-10-11T17:04:07.493 回答