小編給大家分享一下Laravel5.3和Workerman結(jié)合使用異步的示例,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
成都創(chuàng)新互聯(lián)致力于網(wǎng)站建設(shè),網(wǎng)站制作設(shè)計(jì),營(yíng)銷(xiāo)網(wǎng)頁(yè)定制制作,外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),小程序開(kāi)發(fā),網(wǎng)站SEO優(yōu)化,網(wǎng)站設(shè)計(jì)制作案例豐富,是成都做網(wǎng)站公司和建站公司,歡迎咨詢。
網(wǎng)上查閱資料有現(xiàn)成和workerman結(jié)合的composer組件,但個(gè)人感覺(jué)不太靠譜,github上star太少,而且怕有問(wèn)題也不好調(diào),就想自己先試試。
我的辦法因?yàn)樾薷囊稽c(diǎn)Workerman源碼,且是直接引入Workerman的代碼文件,感覺(jué)有點(diǎn)low,但才智有限,暫時(shí)沒(méi)想到更好的方法。
準(zhǔn)備:
1.需先了解Laravel框架下命令行的使用,參考中文版教程
2.需了解Workerman的基本知識(shí)
場(chǎng)景:用戶注冊(cè)后,異步方式給用戶發(fā)送郵件提醒
1.把Workerman框架放到app目錄下
2.創(chuàng)建命令代碼:
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('注冊(cè)成功', function (Message $message) use ($email) { $message->to($email)->subject(trans('mail.welcome_register')); }); // 寫(xiě)入日志 Log::useFiles(storage_path() . '/logs/event.log', 'info'); Log::info("{$name}({$email})注冊(cè)成功"); }; Worker::runAll(); } }
以上是workerman服務(wù)端,用命令行啟動(dòng):
php artisan send:email start
此時(shí)命令行下會(huì)報(bào)錯(cuò):Workerman[artisan] not run,原因是Workerman會(huì)把第一個(gè)參數(shù)artisan當(dāng)前啟動(dòng)文件,而實(shí)際上,send:email才是我們想要的啟動(dòng)文件
解決:修改Workerman的解析參數(shù)代碼
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] : ''; } // 只要略修改上面的參數(shù)解析部分即可 .......................... }
重新啟動(dòng)OK:
php artisan send:email start
3.服務(wù)端完成了,下面是客戶端代碼
我的郵件操作代碼是當(dāng)作事件邏輯,所以在事件監(jiān)聽(tīng)器文件寫(xiě)代碼:
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) { // 發(fā)送郵件通知注冊(cè)成功 if ($event->user->scene == 'do_register') { $email = $event->user->email; //$ip = "mail_worker 的ip" ,本機(jī)的話為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協(xié)議后面"\n"換行符是必須的 $mail_buffer = json_encode($mail_data) . "\n"; // 發(fā)送給mail worker fwrite($socket, $mail_buffer); } // $email = $event->user->email; // Mail::raw('注冊(cè)成功',function (Message $message) use ($email) { // $message->to($email)->subject(trans('mail.welcome_register')); // }); } } }
4.總結(jié)步驟
啟動(dòng)服務(wù)端---注冊(cè)用戶---觸發(fā)SendEmail事件---socket客戶端往服務(wù)端寫(xiě)數(shù)據(jù)---服務(wù)端發(fā)送郵件
看完了這篇文章,相信你對(duì)“Laravel5.3和Workerman結(jié)合使用異步的示例”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
網(wǎng)站欄目:Laravel5.3和Workerman結(jié)合使用異步的示例
本文來(lái)源:http://jinyejixie.com/article28/pgipjp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、網(wǎng)站建設(shè)、靜態(tài)網(wǎng)站、域名注冊(cè)、微信小程序、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)