Laravel5.3和Workerman结合使用(异步)

下面由workerman使用教程栏目给大家介绍laravel5.3和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 AppConsoleCommands;use IlluminateConsoleCommand;use IlluminateSupportFacadesLog;use IlluminateSupportFacadesMail;use IlluminateMailMessage;use WorkermanWorker;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的解析参数代码

WorkermanWorkerman_LinuxWorker.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.服务端完成了,下面是客户端代码

我的邮件操作代码是当作事件逻辑,所以在事件监听器文件写代码:

appListenersSendMailEventListener.php:
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结合使用(异步)的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/105494.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
微博网页版免登官网 微博免登录网页版链接
上一篇 2025年11月22日 02:49:56
Z世代如何解决单身问题?Hobbyx华为云Tokens服务带来“AI的初体验”
下一篇 2025年11月22日 02:51:58

相关推荐

发表回复

登录后才能评论
关注微信