>  기사  >  PHP 프레임워크  >  Workerman과 결합된 Laravel5.3(비동기)

Workerman과 결합된 Laravel5.3(비동기)

尚
앞으로
2019-11-25 17:11:202586검색

아래의 workerman 사용법 튜토리얼 칼럼에서는 Laravel5.3과 Workerman을 함께 (비동기적으로) 사용하는 방법을 소개하겠습니다. 도움이 필요한 친구들에게 도움이 되길 바랍니다!

Workerman과 결합된 Laravel5.3(비동기)

온라인 정보에는 Workerman과 결합된 기성 작곡가 컴포넌트가 있다고 나와 있지만 개인적으로 github에는 별이 너무 적고 두려움 때문에 조정하기 어렵다고 느낍니다. 문제가 있어서 먼저 직접 해보고 싶어요.

내 방법은 수정하려면 약간의 Workerman 소스 코드가 필요하고 Workerman의 코드 파일을 직접 도입하기 때문에 약간 낮은 느낌이 들지만 재능이 제한되어 있어서 더 좋은 방법은 아직 생각해 본 적이 없습니다.

준비:

1. 먼저 Laravel 프레임워크에서 명령줄의 사용법을 이해해야 합니다. 중국어 버전의 튜토리얼을 참조하세요.

2 Workerman의 기본 지식을 이해해야 합니다.

시나리오: 이후 사용자가 등록하면 사용자에게 이메일 알림을 비동기식으로 보냅니다

1. Workerman 프레임워크를 앱 디렉터리에 배치합니다

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] : '';
        }
    
     // 只要略修改上面的参数解析部分即可 
     ..........................
}

다시 시작 확인:

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 이벤트 트리거---소켓 클라이언트가 서버에 데이터를 씁니다---서버가 이메일을 보냅니다

권장: Workerman Tutorial

위 내용은 Workerman과 결합된 Laravel5.3(비동기)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제