下面由workerman使用教程栏目给大家介绍laravel5.3和workerman结合使用(异步)的方法,希望对需要的朋友有所帮助!
网上查阅资料有现成和workerman结合的composer组件,但个人感觉不太靠谱,github上star太少,而且怕有问题也不好调,就想自己先试试。
我的办法因为修改要一点workerman源码,且是直接引入workerman的代码文件,感觉有点low,但才智有限,暂时没想到更好的方法。
准备:
1.需先了解laravel框架下命令行的使用,参考中文版教程
2.需了解workerman的基本知识
场景:用户注册后,异步方式给用户发送邮件提醒
1.把workerman框架放到app目录下
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] not run,原因是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:
<?phpnamespace 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事件---socket客户端往服务端写数据---服务端发送邮件
推荐:workerman教程
以上就是laravel5.3和workerman结合使用(异步)的详细内容。