Think-Swoole Task 비동기 작업

풀어 주다: 2020-10-27 13:39:09
앞으로
3913명이 탐색했습니다.

Think-Swoole Task 비동기 작업

사용 시나리오

방송을 채팅 서버로 보내고, 이메일을 웹 서버로 보내는 등 시간이 많이 걸리는 작업을 서버 프로그램에서 수행해야 하는 경우. 이러한 기능을 직접 실행하면 현재 프로세스가 차단되어 서버의 응답 속도가 느려집니다. 예: 사용자 등록 시나리오에서 등록을 완료하고 활성화 이메일을 보내는 기능에는 다음 단계가 필요합니다.

클라이언트가 POST 데이터를 제출합니다. -> 서버가 데이터를 얻습니다. 데이터베이스 -> 계정 활성화 이메일 보내기 -> 클라이언트로 돌아가서 등록이 성공했다는 메시지를 표시합니다.

이 비즈니스 로직에는 문제가 없지만 이메일을 보내는 것은 시간이 많이 걸리는 작업(예: 2-3초)이고 프로그램 실행을 동기적으로 차단하므로 클라이언트가 등록 성공 메시지를 받을 때까지 전송이 성공했습니다. 이 과정에서 제출부터 최종 등록 성공 알림까지 약 4초 정도 소요되는 것으로 추정되는데, 이는 확실히 무리한 일입니다!

이제 작업 비동기 작업 전달을 사용하면 일반적인 프로세스는 다음과 같습니다.

클라이언트가 POST 데이터를 제출합니다. -> 서버가 데이터를 얻습니다. -> 등록을 완료하고 사용자 데이터를 데이터베이스에 씁니다. > 즉시 클라이언트 프롬프트 등록 성공으로 돌아갑니다.

등록 성공 시 작업 전달 -> 시간이 많이 소요되는 이메일 전송 작업을 비동기식으로 완료합니다(응답이 클라이언트에 매우 일찍 반환되었기 때문에 사용자는 이 부분을 알지 못합니다).

Think-Swoole의 Task 비동기 작업을 사용하는 방법에 대한 단계

이벤트 청취 클래스를 정의합니다(php think make:listener 클래스 이름).

swoole.task의 이벤트 모니터링은 app/event.php 파일에 정의되어 있습니다.

Swoole/Server 개체를 가져오고 작업 메서드를 호출합니다(매개변수에 방금 정의한 청취 클래스 전달).

방금 정의한 이벤트 리스닝 클래스의 핸들 메소드에 트리거 콜백 로직 코드를 정의하세요.

작업이 완료된 후 작업 swoole.finish를 트리거하는 완료 메서드를 호출합니다(필요할 때만 호출되며 필수는 아닙니다).

Demonstration

먼저 프로젝트 루트 디렉터리에 이메일 전송 이벤트를 만듭니다.

php think make:listener EmailTask
로그인 후 복사

그런 다음 생성된 이메일 전송 이벤트를 정의합니다.

app/event.php
'listen'    => [
    'AppInit'  => [],
    'HttpRun'  => [],
    'HttpEnd'  => [],
    'LogLevel' => [],
    'LogWrite' => [],
    'swoole.task' => [
        app\listener\EmailTask::class,
    ],
//  'swoole.finish' => [
//      app\listener\EmailTaskFinish::class,
//  ],
],
로그인 후 복사

swoole.task의 키 이름은 Task입니다. 임의로 이름을 지정하십시오.

다음으로, 사용자 등록을 담당하는 컨트롤러의 Swoole/Server 클래스를 통해 Task 비동기 작업을 호출합니다. 물론 먼저 EmailTask.php의 논리 코드를 개선해야 합니다.

app/listener/EmailTask.php

<?php
declare (strict_types = 1);
namespace app\listener;
class EmailTask
{
    /**
     * 事件监听处理
     *
     * @return mixed
     */
    public function handle($event)
{
        echo "开始发送邮件:".time();
        //模拟耗时 3 秒,测试是否在响应事件内
        sleep(3);
        echo "邮件发送成功:".time();
        // 可以调用 finish 方法通知其他事件类,通知当前异步任务已经完成了(非必须调用)
        // 参数 $event 是 Swoole\Server\Task 类的一个对象 可以调用 finish 方法触发 task 任务的 onFinish 事件
        // $event -> finish(\app\listener\EmailTaskFinish::class);
    }
}
로그인 후 복사

등록 방법 app/controller/Register.php

<?php
namespace app\controller;
use app\BaseController;
class Register extends BaseController
{
    public function register(\Swoole\Server $server)
{
        if($this -> request -> isPost()){
            $data = $this -> request -> post();
            //TODO 调用验证类验证数据
            //TODO 将注册信息插入数据库
            // 这里调用 Task 异步任务
            $server -> task(\app\listener\EmailTask::class);
            // 方式二
//            $manager = app(&#39;\think\swoole\Manager&#39;);
//            $manager -> getServer() -> task(\app\listener\EmailTask::class);
            return "注册成功!".time();
        }
    }
}
로그인 후 복사

등록 사업에서 데이터베이스에 삽입한 후 이메일 전송이라는 비동기 작업이 호출됩니다. EmailTask.php에서 이메일 전송을 시뮬레이션하는 데 3초가 걸립니다.

Think-Swoole 서비스를 열고 등록 방법에 접속하여 사용자 등록 방법에 이메일 전송 시간이 포함되어 있는지 테스트합니다.

Think-Swoole Task 비동기 작업

이메일 전송의 3초가 비동기식임을 알 수 있으며, 사용자는 그것을 인식하지 못합니다.

또한 현재 비동기 작업이 완료되었음을 다른 이벤트에 알리는 데 사용되는 swoole.finish 이벤트도 있으며 app/event.php에서 swoole.finish를 정의해야 합니다. 샘플 코드가 시연되었습니다.

위 내용은 Think-Swoole Task 비동기 작업의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:阿dai哥
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿