web-dev-qa-db-ja.com

laravel)で関数をバックグラウンドで実行する方法

Laravel 5.0でWebサイトを開発しており、WindowsServer2012でホストされています。

別の関数Aからコントローラーの関数Bを呼び出しているという問題で立ち往生しており、別の関数Bを呼び出す関数Aが関数Bの完了を待たないようにしたい。そして、関数Bはバックグラウンドで完了し、独立したフォームでユーザーがページを終了し、関数Aが戻ります。

これを検索したところ、Windowsのcronのようなジョブ、pcntl_fork()、laravelのキュー機能を使用して実装できることがわかりました。私はこれらすべての初心者です。

助けてください!前もって感謝します。

9
Nilesh

ドキュメントに記載されているように 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

それは答えますか?

13
UX Labs