Laravel --- 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:
<?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事件---socket客户端往服务端写数据---服务端发送邮件
如果各位有更好的结合方式,一起交流下哈。
Laravel --- Laravel5.3 和 Workerman结合使用(异步)的更多相关文章
- laravel集成workerman,使用异步mysql,redis组件时,报错EventBaseConfig::FEATURE_FDS not supported on Windows
由于laravel项目中集成了workerman,因业务需要,需要使用异步的mysql和redis组件. composer require react/mysql composer require c ...
- Laravel 5.4 快速开发简书:
Laravel 5.4 快速开发简书第1章 课程介绍 介绍课程的大体脉络和课程安排 第2章 Laravel 5.4介绍 本节课会带领大家介绍laravel的各个版本历史以及讨论php框架的未来发展趋势 ...
- PHP框架 Laravel Eloquent ORM 批量插入数据 && 批量更新目前没有
foreach ($products as $v=>$a) { $count[] = array('product_name' => $a['name'], 'product_weight ...
- [Laravel 5 教程学习笔记] 一、Windows下安装Laravel 5
最近看到一些统计,说是Laravel是目前PHP框架中使用最多的,所以就想来学习下.之前其实也想过学习这个框架,但是每次到第一步安装的时候就卡住了,无奈 .之前用ThinkPHP的时候,下载完放到网 ...
- Laravel5 学习与使用(一)
2015-07-04 (1) 安装Laravel框架 ① 安装前的准备工作 使用Apache24 + PHP 5.6 + MySQL 开发环境完成PHP网站开发,所以Laravel的安装是建立在以上 ...
- 怎么利用composer创建laravel项目
前提:已经安装了composer的电脑 创建laravel项目: 第一步: 找到你要创建文件的地方 然后打开doc,输入:composer create_project laravel/laravel ...
- Laravel安装及环境的配置(XAMPP集成开发环境下)
Laravel 使用 Composer 来管理代码依赖.所以,在使用 Laravel 之前,请先确认你的电脑上安装了 Composer. 操作系统为win7: 集成开发环境XAMPP: 第一步:安装C ...
- GatewayWorker+Laravel demo
GatewayWorker 结合 Laravel 使用的简单案例,重点是在Laravel中使用GatewayClient发送消息 主要流程:GatewayWorker主要负责推送消息给客户端但不接受客 ...
- 【Laravel】 安装及常用的artisan命令
composer Laravel 安装 cmd composer create-project laravel/laravel Laravel5 之后自动创建 常用的artisan命令 全局篇 查看a ...
随机推荐
- Codeforces 85B. Embassy Queue【段树、馋】
标题效果: 每个人都应该申请签证必须向大使馆3种程序,而这3个步骤做的顺序是固定的.通过各种形式的手续给出多少,它需要对每个过程的处理时间,有多少人会来办理手续,什么时间来.要求的是全部人分别在大使馆 ...
- jquer表单序列化加强版
相同name值会转化为一个数组 $.fn.serializeObject = function(){ var o = {}; var a = this.serializeArray(); $.each ...
- yii联查
$count = Acticle::find()->select("acticle_type.act_type,acticle.act_id,acticle.act_title,act ...
- Android--数据持久化存储概述
Android数据持久化存储共有四种方式,分别是文件存储.SharedPreferences.Sqlite数据库和ContentProvider.在本篇幅中只介绍前面三种存储方式,因为ContentP ...
- Ado.net连接字符串
学习刘皓的 文章ADO.NET入门教程(三) 连接字符串,你小觑了吗? 连接字符串主要有DataSource 指定地址 通常是ip 如果Express 就要使用形如 ./Express或者 (loca ...
- Codeforces 458A Golden System
经过计算两个字符串的大小对比 主要q^2=q+1 明明是斐波那契数 100000位肯定超LL 我在每一位仅仅取到两个以内 竟然ac了 #include<bits/stdc++.h> usi ...
- VC实现程序重启的做法
作者:朱金灿 来源:http://blog.csdn.net/clever101 很多时候系统有很多配置项,修改了配置项之后能有一个按钮实现系统重启.所谓重启就是杀死系统的当前进程,然后重新开一个新进 ...
- Rancher 2.2.2 - HA 部署高可用k8s集群
对于生产环境,需以高可用的配置安装 Rancher,确保用户始终可以访问 Rancher Server.当安装在Kubernetes集群中时,Rancher将与集群的 etcd 集成,并利用Kuber ...
- .net core service && angular项目 iis发布
项目结构 .net core 后端服务站点 angular 前端页面站点 项目模板来自于abp或者52abp .net core 后端服务站点发布到IIS 发布报错 .Net Core使用IIS部署出 ...
- Ajax请求小结
参数说明 ajax请求异步刷新页面=把需要异步刷新的页面单独写成一个.cshtml进行操作$.ajax({}); -------ajax方法.type: ------- 类型,此处为“POST” 还有 ...