Запустите функцию в фоновом режиме в Laravel 4.2 - PullRequest
0 голосов
/ 11 марта 2019

У меня есть одна функция, выполнение которой занимает много времени, поэтому я хочу запустить эту функцию в фоновом режиме, это возможно?

Я хочу запустить эту функцию при нажатии пользователем кнопки.и не хочу запускать какие-либо команды из терминала.

Спасибо

1 Ответ

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

Для реализации системы очередей необходимо выполнить эти шаги.

- при нажатии кнопки маршрута (/ usertask / executeAction) В вашем контроллере предположим (UserTaskController.php) 1 - добавить пространство имен для ваших рабочих мест.

<?php
use App\Jobs\ProcessTask; // job class that will be created later


class UserTaskController extends Controller
{


// controllers function
function performAction()
{
    ...
    ...
    ...

    // code to place background task
    $data =  [];
    $job  = ( new ProcessTask($userId, $data))->onQueue('ProcessTask');

    if ($this->dispatch($job)) {
        info('job dispatched');
    } else {
        info('job dispatch failed');
    }
    // code to place background task ends
}

теперь создайте файл задания. (ProcessTask.php) внутри вашей папки заданий. ProcessTask.php

--------

<?php

namespace App\Jobs;

use Log;
use App\Jobs\Job;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;

class ProcessTask extends Job implements ShouldQueue
{

    use InteractsWithQueue,
        SerializesModels;

    /**
     * Create a new command instance.
     *
     * @return void
     */

    protected $userId;
    protected $data;


    public function __construct($userId, $data)
    {
        $this->userId = $userId;
        $this->data = $data;
    }

    /**
     * Execute the command.
     *
     * @return void
     */
    public function handle()
    {
        try {
            // perform your task
            /*
            $this->userId
            $this->data
            */
            return true;
        } catch (\Exception $e) {
            Log::error('ProcessTask:: Exception occured ');
            Log::error($e);
            $this->release(); //release the job back to queue, as attempts increase fail to be
            return false;
        }
    }


    public function failed()
    {
        Log::info('ProcessTask :: failed ends');
    }
}

?>

/// теперь вы можете запускать свои задания в терминале ()

php arrtisan queue:listen --queue=ProcessTask --timeout=600 

в вашем терминале (или вы можете разместить это в супервизоре)

настройки, связанные с драйвером очереди -

/var/www/html/infinito/config/queue.php

make QUEUE_DRIVER as database.

'default' => env('QUEUE_DRIVER', 'database'),
...