2015-07-16 3 views
6

Я разрабатываю веб-сайт в Laravel 5.0 и размещен в Windows Server2012.Как сделать функцию запуска в фоновом режиме в laravel

Я застрял в проблеме, которая является вызовом функции B в контроллере из другой функции A, и я хочу, чтобы функция A, вызывающая другую функцию B, не дождалась завершения функции B. И функция B завершается в фоновом режиме и независимая форма завершения пользователем страницы и функции. Возврат.

Я искал это и обнаружил, что это можно реализовать с помощью cron-заданий в windows, pcntl_fork() и функции Queue в laravel. Я новичок во всем этом.

Пожалуйста, помогите! заранее спасибо.

ответ

8

в документации говорится http://laravel.com/docs/5.1/queues, сначала необходимо установить драйвер - я бы для базы данных в начале:

php artisan queue:table 

php artisan migrate 

затем создать работу, которую вы хотите добавить в очередь

<?php 

namespace App\Jobs; 

use App\User; 
use App\Jobs\Job; 
use Illuminate\Contracts\Mail\Mailer; 
use Illuminate\Queue\SerializesModels; 
use Illuminate\Queue\InteractsWithQueue; 
use Illuminate\Contracts\Bus\SelfHandling; 
use Illuminate\Contracts\Queue\ShouldQueue; 

class SendEmail extends Job implements SelfHandling, ShouldQueue 
{ 
    use InteractsWithQueue, SerializesModels; 

    protected $user; 

    public function __construct(User $user) 
    { 
     $this->user = $user; 
    } 

    public function handle(Mailer $mailer) 
    { 
     $mailer->send('emails.hello', ['user' => $this->user], function ($m) { 
      // 
     }); 
    } 
} 

затем в контроллере отправки РАБОЧЕМ МЕСТЕ

<?php 

namespace App\Http\Controllers; 

use App\User; 
use Illuminate\Http\Request; 
use App\Jobs\SendReminderEmail; 
use App\Http\Controllers\Controller; 

class UserController extends Controller 
{ 
    /** 
    * Send a reminder e-mail to a given user. 
    * 
    * @param Request $request 
    * @param int $id 
    * @return Response 
    */ 
    public function sendReminderEmail(Request $request, $id) 
    { 
     $user = User::findOrFail($id); 

     $sendEmailJob = new SendEmail($user); 

     // or if you want a specific queue 

     $sendEmailJob = (new SendEmail($user))->onQueue('emails'); 

     // or if you want to delay it 

     $sendEmailJob = (new SendEmail($user))->delay(30); // seconds 

     $this->dispatch($sendEmailJob); 
    } 
} 

Для этого вам необходимо запустить приемник очередей:

php artisan queue:listen 

Ответит ли это на этот вопрос?

+0

Что делать, если я хочу сделать процесс, кроме почты? – Nilesh

+0

Вы можете делать все, что захотите, в разделе дескриптора, это просто пример –

+0

Нужен ли мне драйвер очереди или только этот код будет работать? – Nilesh

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