**一、项目根目录创建订单取消事件:** 创建成功后,在app目录下会生成listener目录以及OrderCancelTask.php ~~~ php think make:listener OrderCancelTask ~~~ ![](https://img.kancloud.cn/49/79/49792163d3e6fce3e96f11589df905f4_640x160.png) **二、在app/event.php中定义订单取消事件:** ~~~ <?php // 事件定义文件 return [ 'bind' => [ ], 'listen' => [ 'AppInit' => [], 'HttpRun' => [], 'HttpEnd' => [], 'LogLevel' => [], 'LogWrite' => [], 'swoole.task' => [ app\listener\OrderCancelTask::class, ], ], 'subscribe' => [ ], ]; ~~~ **三、完善 OrderCancelTask.php 的逻辑代码** ~~~ <?php declare (strict_types = 1); namespace app\listener; class OrderCancelTask { /** * 事件监听处理 * * @return mixed */ public function handle($event) { var_dump($event->data); echo iconv('utf-8', 'gbk//IGNORE','下单成功时间:').time().PHP_EOL; //模拟1分钟后取消订单 //`Swoole\Timer::after`在指定的时间后执行函数,是一个一次性定时器,执行完成后就会销毁。 \Swoole\Timer::after(60000, function (int $timer_id, $param) { //TODO 判断订单是否已经支付,如果未支付,取消订单 echo iconv('utf-8', 'gbk//IGNORE','订单编号:') .$param["orderSn"].iconv('utf-8', 'gbk//IGNORE','超时未支付,已取消').PHP_EOL; echo time().PHP_EOL; }, $event->data); return; } } ~~~ **四、完善Order.php 的逻辑代码** ~~~ <?php // +---------------------------------------------------------------------- // | najing [ 通用后台管理系统 ] // +---------------------------------------------------------------------- // | Copyright (c) 2020 http://www.najingquan.com All rights reserved. // +---------------------------------------------------------------------- // | Author: 救火队队长 // +---------------------------------------------------------------------- namespace app\controller; use app\BaseController; /** * 订单管理 * Class Order * @package app\controller */ class Order extends BaseController { public function save() { //TODO 调用验证类验证数据 //TODO 将订单信息插入数据库 //异步模拟 $manager = app('\think\swoole\Manager'); $data = [ 'orderSn' => '202005260001', 'time' => time() ]; $manager->getServer()->task($data); return "下单成功!".time(); } } ~~~ 访问下单的方法,测试一下是否可以正常取消: ![](https://img.kancloud.cn/11/b3/11b316402578e3ac23a281ae19a79e54_593x122.png) ![](https://img.kancloud.cn/f1/cc/f1cc95a93add6470b3945e216a5898e5_554x196.png)