搜索
首页php框架WorkermanLaravel5.3和Workerman结合使用(异步)

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

Nov 25, 2019 pm 05:11 PM
laravelworkerman

下面由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 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的解析参数代码

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

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

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 == &#39;do_register&#39;) {
            $email = $event->user->email;

            //$ip = "mail_worker 的ip" ,本机的话为127.0.0.1
            $socket = @stream_socket_client(&#39;tcp://127.0.0.1:12345&#39;, $errno, $errmsg, 5);
            if ($socket) {
                $mail_data = [&#39;name&#39;=>$event->user->name,&#39;to&#39; => $email, &#39;content&#39; => trans(&#39;mail.welcome_register&#39;)];
                // 注意,Text协议后面"\n"换行符是必须的
                $mail_buffer = json_encode($mail_data) . "\n";
                // 发送给mail worker
                fwrite($socket, $mail_buffer);
            }

//            $email = $event->user->email;
//            Mail::raw(&#39;注册成功&#39;,function (Message $message) use ($email) {
//                $message->to($email)->subject(trans(&#39;mail.welcome_register&#39;));
//            });
        }
    }
}

4.总结步骤

启动服务端---注册用户---触发SendEmail事件---socket客户端往服务端写数据---服务端发送邮件

推荐:Workerman教程

以上是Laravel5.3和Workerman结合使用(异步)的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:博客园。如有侵权,请联系admin@php.cn删除

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!