次のコラム 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 == 'do_register') { $email = $event->user->email; //$ip = "mail_worker 的ip" ,本机的话为127.0.0.1 $socket = @stream_socket_client('tcp://127.0.0.1:12345', $errno, $errmsg, 5); if ($socket) { $mail_data = ['name'=>$event->user->name,'to' => $email, 'content' => trans('mail.welcome_register')]; // 注意,Text协议后面"\n"换行符是必须的 $mail_buffer = json_encode($mail_data) . "\n"; // 发送给mail worker fwrite($socket, $mail_buffer); } // $email = $event->user->email; // Mail::raw('注册成功',function (Message $message) use ($email) { // $message->to($email)->subject(trans('mail.welcome_register')); // }); } } }
4. 概要手順
サーバーを起動します---ユーザーを登録します---SendEmail イベントをトリガーします---クライアントをサービスにソケットしますクライアントにデータを書き込みます---サーバーに電子メールを送信します
推奨事項:
ワーカーマンのチュートリアル以上がLaravel5.3とWorkermanの組み合わせ(非同期)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。