Очередь в ларавелле с редисом - PullRequest
1 голос
/ 05 марта 2019

У меня проблемы с приложением, в котором я выполняю много вызовов API в бэкэнде.Из-за этого приложение получает ошибку тайм-аута.

Кто-то предложил мне использовать Очереди.Я пытался сделать это с помощью Redis.Функция включается в работу и использует обработчик, но я ожидал, что страница загрузится с данными, которые я ей предоставляю, без данных из API, в то время как API-вызов выполняется в фоновом режиме.Вместо этого это просто прошло, как когда я не использовал очередь.Я пытался следовать руководству, чтобы сделать это, но они не делали то же самое, и я не мог настроить его так, чтобы он работал для меня.

Для информации о том, что я делаю в работе.Я получаю комментарии из CSV, и я использую числа в комментариях для вызова API, и я получаю JSON примерно 8-10 полей.Мне нужно вызывать API около 650 раз, поэтому это занимает много времени, когда я хочу сохранить данные в базу данных.Я использую одну вставку за раз, чтобы использовать «кэширование», поэтому я не буду делать один и тот же вызов дважды.

Это контроллер, на котором я вызываю задание.

class ImportController extends Controller
{
public function checkErrors(Request $request)
{
    $this->checkAgainstDocuments($csv_id);
    $supplierErrorIds=$this->checkSupplierErrors($parameters, $company , $csv_id);
    $timesheetErrors=TsData::whereIn('id', $supplierErrorIds)->sortable()->paginate(20);
    return view('show_errors', compact('timesheetErrors', 'company', 'csv_id'));
}

public function checkAgainstDocuments($csv_id)
{
    GetFromDocumentsAPI::dispatch($csv_id)->delay(now()->addMinutes(10));
}
}

ЭтоЯ использую работу:

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

protected $csv_id;
/**
 * Create a new job instance.
 *
 * @return void
 */
public function __construct($csv_id)
{
    //
    $this->csv_id=$csv_id;
}

/**
 * Execute the job.
 *
 * @return void
 */
public function handle()
{
    $comments = TsData::select('id', 'comments')->where('csv_id', $this->csv_id)->get()->toArray();

    $commentIDs = array();

    foreach ($comments as $comment) {
        preg_match_all('/(\d{5,})/', $comment['comments'], $out, PREG_PATTERN_ORDER);
        foreach ($out as $item) {
            $commentIDs[$comment['id']] = $item;
        }
    }

    $commentIDs = array_filter($commentIDs);

    $apiKey=config('app.apiKey');

    $documentsResponse = array();

    Issue::truncate();

    $arrayTest=[];

    foreach ($commentIDs as $key => $commentID) {
        foreach ($commentID as $item) {
            $issue = Issue::where('id', $item)->first();

            if ($issue === null) {
                try {
                    $url = file_get_contents('https://documents.calibrate.be/issues/' . $item . '.json?key=' . $apiKey);
                    $json = json_decode($url, true);
                } catch (Exception $e) {
                    echo 'Caught exception: ', $e->getMessage(), "\n";
                }



$issue = Issue::Create(['id'=>$item, 'name'=>$json['issue']['subject'], 'projectId'=>$json['issue']['project']['id'], 'priority'=>$json['issue']['priority']['id']]);

        }
    }
}

}

config / queue.php

'default' => env('QUEUE_DRIVER', 'redis'),

'redis' => [
        'driver' => 'redis',
        'connection' => 'default',
        'queue' => env('REDIS_QUEUE', 'default'),
        'retry_after' => 90,
        'block_for' => null,
    ],

1 Ответ

0 голосов
/ 05 марта 2019

По умолчанию Laravel использует драйвер sync для обработки очередей.

Убедитесь, что для переменной конфигурации QUEUE_CONNECTION установлено значение database или redis или любая другая служба.То же самое можно установить в файле .env, а также в файле config/queue.php.

Чтобы использовать database, выполните

  1. Выполните php artisan queue:table и php artisan migrate,Это создаст все необходимые таблицы для запуска.
  2. Убедитесь, что работник очереди работает в фоновом режиме.Вы можете сделать это в консоли, запустив php artisan queue:work

. Чтобы использовать redis, выполните

  1. Установите sudo apt-get install redis-server и запустите сервер redis $ sudo systemctl enable redis-server.service.(Для систем на базе Linux)
  2. Сконфигурируйте и установите переменные, специфичные для redis, в .env или config/queue.php

PS Выполните команду php artisan config:clear после внесения изменений, чтобыизменения отражаются в кеше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...