2015-07-16 11 views
6

Sto sviluppando un sito Web in Laravel 5.0 e ospitato su Windows Server2012.Come far funzionare la funzione in background in laravel

Sono bloccato a un problema che sta chiamando una funzione B nel controller da un'altra funzione A e voglio che la funzione A che chiama l'altra funzione B non aspetti il ​​completamento della funzione B. E la funzione B viene completata in background e la chiusura indipendente della pagina da parte dell'utente e la funzione A return.

Ho cercato questo e ho scoperto che questo può essere implementato tramite cron come job in windows, pcntl_fork() e funzionalità Queue in laravel. Sono principiante in tutto questo.

Si prega di aiuto! Grazie in anticipo.

risposta

8

la documentazione afferma http://laravel.com/docs/5.1/queues, in primo luogo è necessario configurare il driver - vorrei andare per il database in principio:

php artisan queue:table 

php artisan migrate 

poi creare il lavoro che si desidera aggiungere alla coda

<?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) { 
      // 
     }); 
    } 
} 

poi nel controller spedizione il lavoro

<?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); 
    } 
} 

Affinché funzioni, è necessario che sia in esecuzione il Queue Listener:

php artisan queue:listen 

Questa risposta?

+0

E se volessi eseguire un processo diverso dalla posta ?? – Nilesh

+0

Puoi fare ciò che vuoi nella sezione handle, l'e-mail è solo un esempio –

+0

Ho bisogno di un driver Queue o solo questo codice funzionerà ?? – Nilesh

Problemi correlati