사용 시나리오
방송을 채팅 서버로 보내고, 이메일을 웹 서버로 보내는 등 시간이 많이 걸리는 작업을 서버 프로그램에서 수행해야 하는 경우. 이러한 기능을 직접 실행하면 현재 프로세스가 차단되어 서버의 응답 속도가 느려집니다. 예: 사용자 등록 시나리오에서 등록을 완료하고 활성화 이메일을 보내는 기능에는 다음 단계가 필요합니다.
클라이언트가 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('\think\swoole\Manager'); // $manager -> getServer() -> task(\app\listener\EmailTask::class); return "注册成功!".time(); } } }
등록 사업에서 데이터베이스에 삽입한 후 이메일 전송이라는 비동기 작업이 호출됩니다. EmailTask.php에서 이메일 전송을 시뮬레이션하는 데 3초가 걸립니다.
Think-Swoole 서비스를 열고 등록 방법에 접속하여 사용자 등록 방법에 이메일 전송 시간이 포함되어 있는지 테스트합니다.
이메일 전송의 3초가 비동기식임을 알 수 있으며, 사용자는 그것을 인식하지 못합니다.
또한 현재 비동기 작업이 완료되었음을 다른 이벤트에 알리는 데 사용되는 swoole.finish 이벤트도 있으며 app/event.php에서 swoole.finish를 정의해야 합니다. 샘플 코드가 시연되었습니다.
위 내용은 Think-Swoole Task 비동기 작업의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!