2016-12-18 1 views
2

Я создал artisan command, который я хочу запустить сразу после вызванного метода. Но команда содержит команду sleep();. Я хочу запустить команду artisan в фоновом режиме, потому что метод должен return сразу же ответить пользователю. Мой пример кода является ниже:Как спать PHP (Laravel 5.2) в фоновом режиме

В файле маршрута

Route::get('test', function(){ 
    Artisan::queue('close:bidding', ['applicationId' => 1]); 
    return 'called close:bidding'; 
}); 

В close:bidding команда

public function handle() 
    { 
     $appId = $this->argument('applicationId'); 
     //following code line is making the problem 
     sleep(1000 * 10); 
     //close bidding after certain close time 
     try{ 
      Application::where('id', $appId)->update(['live_bidding_status' => 'closed']); 
     }catch (\PDOException $e){ 
      $this->info($e->getMessage());//test purpose 
     } 
     $this->info($appId.": bid closed after 10 seconds of creation"); 
    } 

Проблема Когда я ударил /test URL возвращенная строка called close:bidding это время после 10 секунд загрузки браузера, becaus e внутри команды находится sleep(10 * 1000).

Что я хочу Я хочу запустить команду в фоновом режиме. Я имею в виду, когда я нажимаю url /test, он должен немедленно отобразить called close:bidding, но команда close:bidding будет работать в фоновом режиме. Через 10 секунд он обновит приложение, хотя внешний пользователь ничего не заметит.

Частичные Вопросы

  1. ли это как-то связано с multi threading?

  2. Это что-то, что нельзя решить с помощью PHP, следует ли думать иначе?

  3. Есть ли способ решить эту проблему даже при использовании очереди Laravel?

+0

Может быть, вы можете попробовать laravel queue jobs вместо команды – vijaykumar

+0

Спасибо, я попробую – Imran

ответ

2

Создать работу

<?php 

namespace App\Jobs; 

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

class JobTest implements ShouldQueue 
{ 
    use InteractsWithQueue, Queueable, SerializesModels; 

    private $payload = []; 
    public function __construct($payload) 
    { 
     $this->payload = $payload; 
    } 

    /** 
    * Execute the job. 
    * 
    * @return void 
    */ 
    public function handle() 
    { 
     $appId = $this->payload('applicationId'); 
     //following code line is making the problem 
     sleep(1000 * 10); 
    } 
} 

Протолкнуть задания фоновой очереди

Route::get('test', function(){ 
    dispatch((new JobTest)->onQueue('queue_name')); 
    return 'called close:bidding'; 
}); 

В этом состоянии мы имеем работу, и вы диспетчерское задание в очередь. Но он еще не обработан. Нам нужны очереди слушателя или работника, чтобы обработать эти работы в фоновом режиме

php artisan queue:listen --queue=queue_name --timeout=0 
OR 
php artisan queue:work --queue=queue_name --timeout=0 //this will run forever 

Примечание: Может быть, вы можете попробовать supervisord, beanstakd для управления очередью

Для получения дополнительной информации см this

+0

Можете ли вы прояснить свою последнюю команду? То же самое происходит при создании задания и отправке задания в очередь.Я не использовал команду 'php artisan queue: work --queue = queue_name --timeout = 0', потому что у меня нет того, что она делает и зачем она мне нужна. – Imran

+0

Обновление моего ответа может помочь. Или перейдите по ссылке в ответ один раз – vijaykumar

+0

Итак, мне нужно, чтобы слушатель очереди или рабочий выполнял мою работу. Но кто будет запускать команду 'queue: listener' или' queue: worker'? – Imran

1

Если вы не» t нужны все преимущества правильной очереди, которые приходят по цене, может быть достаточно использовать terminate middleware. Он выполнит задание после отправки ответа в браузер.

+0

Будет ли это влиять на дальнейший запрос на сервер? – Imran

+0

@ Al-ImranAhmed, Не уверен, что у меня вопрос. У вас есть какие-то особые проблемы? –

+0

Предположим, я ударил URL-адрес, я получил ответ, после предоставления ответа сервер обрабатывает другую задачу (которая находится в терминальном промежуточном программном обеспечении). В этой задаче у меня есть команда 'sleep (1000 * 10)'. В то же время, если на сервер отправляется другой запрос, будет ли выполняемая задача (sleep) предыдущего запроса влиять на новый запрос. – Imran

Смежные вопросы