Обрабатывая задание Laravel со многими HTTP-запросами внутри, попытка завершается тайм-аутом - PullRequest
0 голосов
/ 11 октября 2019

У меня есть API REST, созданный с использованием фреймворка Laravel 5.8.

Мне нужно получить данные для моего приложения из общедоступного REST API. Для этого мне нужно сделать много запросов. Я сделал сеялку для этого, и примерно 2 минуты на весь процесс переноса данных (возьмите из общедоступного API и вставьте в базу данных моего приложения).

Я не могу запустить сеялку с помощью cronjob, потому что этоне работает (похоже, что пользователю нужно выполнить команду для работы). Итак, я создал класс задания, который я вызываю из файла ядра, конфигурация очереди была выделена как база данных (QUEUE_CONNECTION=database), как запланированное задание (для выполнения с Supervisor: https://laravel.com/docs/5.8/queues#supervisor-configuration).

Несмотря на это,задание не выполняется, потому что выполнение занимает много времени, поэтому мои данные не обновляются.

Что я могу сделать, чтобы успешно обработать мои задания с помощью пакета?

Это мой 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');
    }
}

My 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;
        }
    }
}

И мой Seeder, который я использовал для создания своей работы (путем репликации, исключая выражения для печати):

<?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 запросов), так что я могу сделать, чтобы обработать это задание (или непосредственно сеялку) в фоновом режиме без сбоев?

1 Ответ

0 голосов
/ 11 октября 2019

Правильно ли настроен файл config/queue.php?

Цитата из документации в Срок действия задания абзац:

В вашей конфигурации / очереди. Файл конфигурации php, каждое подключение к очереди определяет параметр retry_after. Этот параметр указывает, сколько секунд подключение к очереди должно ожидать, прежде чем повторять попытку обрабатываемого задания.

...