Laravel5.3とWorkermanの組み合わせ(非同期)

リリース: 2019-11-26 14:31:35
転載
2738 人が閲覧しました

次のコラム workerman 使い方チュートリアル では、Laravel5.3 と Workerman を併用 (非同期) する方法を紹介しますので、困っている方の参考になれば幸いです。

Laravel5.3とWorkermanの組み合わせ(非同期)

ネットの情報を見ると、Workerman と組み合わせた既製の Composer コンポーネントが存在しますが、個人的には信頼できないと感じています。 github にあるので、問題があった場合の調整が難しいので、まずは自分で試してみたかったのです。

私の方法では、Workerman のソース コードを少し変更する必要があり、Workerman のコード ファイルを直接導入するので、少しレベルが低いように感じますが、私の才能には限界があり、これより良い方法は思いつきませんでした。当分の間。

準備:

1. Laravel フレームワークでのコマンド ラインの使用法を理解する必要があります。チュートリアルの中国語版を参照してください。

2. Workerman の基本知識を理解するため

シナリオ: ユーザーが登録した後、ユーザーにメール リマインダーを非同期で送信します

#1. Workerman フレームワークをアプリ ディレクトリに配置します

## 2. コマンド コードを作成します:

php artisan make:command SendEmail
ログイン後にコピー
namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail;
use Illuminate\Mail\Message;
use Workerman\Worker;

require app_path('Workerman/Workerman_Linux/Autoloader.php');

class SendEmail extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'send:email {action}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     */
    public function handle()
    {
        $mailWorker = new Worker('Text://0.0.0.0:12345');
        $mailWorker->count = 4;
        $mailWorker->name = 'MailWorker';
        $mailWorker->onMessage = function ($connection, $emailData) {
            $emailData = json_decode($emailData);
            $name = $emailData->name;
            $email = $emailData->to;
            Mail::raw('注册成功', function (Message $message) use ($email) {
                $message->to($email)->subject(trans('mail.welcome_register'));
            });

            // 写入日志
            Log::useFiles(storage_path() . '/logs/event.log', 'info');
            Log::info("{$name}({$email})注册成功");
        };

        Worker::runAll();
    }
}
ログイン後にコピー

以降 Workerman サーバーです。コマンド ラインで起動します:

php artisan send:email start
ログイン後にコピー
ログイン後にコピー

この時点で、コマンド ラインにエラーが報告されます。 Workerman[artisan] が実行されません。その理由は、Workerman が現在のファイルを開始するために最初のパラメータ Artisan を使用するためです。実際、send:email が必要な起動ファイルです

解決策: Workerman の解析パラメータ コードを変更します

Workerman\Workerman_Linux\Worker.php、parseCommand メソッドを変更します ($argv のキーを変更するだけです。1 を追加するだけです):

/**
     * Parse command.
     * php yourfile.php start | stop | restart | reload | status
     *
     * @return void
     */
    protected static function parseCommand()
    {
        global $argv;

        if($argv[0] == 'artisan') // laravel框架下处理
        {
            // Check argv;
            $start_file = $argv[1];

            if (!isset($argv[2])) {
                exit("Usage: php yourfile.php {start|stop|restart|reload|status}\n");
            }

            // Get command.
            $command  = trim($argv[2]);
            $command2 = isset($argv[3]) ? $argv[3] : '';
        }
        else
        {
            // Check argv;
            $start_file = $argv[0];
            if (!isset($argv[1])) {
                exit("Usage: php yourfile.php {start|stop|restart|reload|status}\n");
            }

            // Get command.
            $command = trim($argv[1]);
            $command2 = isset($argv[2]) ? $argv[2] : '';
        }
    
     // 只要略修改上面的参数解析部分即可 
     ..........................
}
ログイン後にコピー

再起動 OK:

php artisan send:email start
ログイン後にコピー
ログイン後にコピー

3。サーバーが完了したら、次はクライアント コードです

私の電子メール オペレーション コードはイベント ロジックとして扱われるため、イベント リスナー ファイルにコードを記述します:

app\Listeners\SendMailEventListener.php:
ログイン後にコピー
<?php

namespace App\Listeners;

use App\Events\SendMailEvent;class SendMailEventListener extends BaseEventListener
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  SendMailEvent $event
     * @return void
     */
    public function handle($event)
    {
        // 发送邮件通知注册成功
        if ($event->user->scene == &#39;do_register&#39;) {
            $email = $event->user->email;

            //$ip = "mail_worker 的ip" ,本机的话为127.0.0.1
            $socket = @stream_socket_client(&#39;tcp://127.0.0.1:12345&#39;, $errno, $errmsg, 5);
            if ($socket) {
                $mail_data = [&#39;name&#39;=>$event->user->name,&#39;to&#39; => $email, &#39;content&#39; => trans(&#39;mail.welcome_register&#39;)];
                // 注意,Text协议后面"\n"换行符是必须的
                $mail_buffer = json_encode($mail_data) . "\n";
                // 发送给mail worker
                fwrite($socket, $mail_buffer);
            }

//            $email = $event->user->email;
//            Mail::raw(&#39;注册成功&#39;,function (Message $message) use ($email) {
//                $message->to($email)->subject(trans(&#39;mail.welcome_register&#39;));
//            });
        }
    }
}
ログイン後にコピー

4. 概要手順

サーバーを起動します---ユーザーを登録します---SendEmail イベントをトリガーします---クライアントをサービスにソケットしますクライアントにデータを書き込みます---サーバーに電子メールを送信します

推奨事項:

ワーカーマンのチュートリアル

以上がLaravel5.3とWorkermanの組み合わせ(非同期)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:cnblogs.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート