ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
1. swoole的go关键词创建一个协程,可以简单的理解为创建了一个线程.例如异步触发一个监听 ~~~ go(function () use ($test) { Event::trigger('Test', ['test' => $test]); }); ~~~ <blockquote class="danger">如果think-swoole3的版本低于`3.0.6`,在异步中使用了连接池操作(`Db/Cache`等),扩展连接池是无法回收的!!!运行`max_active`次后将报错Uncaught RuntimeException: Borrow the connection timeout in 5.00(s), connections in pool: 0.原因是在携程中使用的连接没有被回收,池内连接也并未得到补充导致的.经测试3.0.6版本是可以正常使用. </blockquote> 2. TaskWorker的使用.前面章节提到过,swoole的所有事件在框架内均可以用监听去实现,前缀为`swoole.`,`onTask`与`onFinish`也是同理. 创建两个监听事件 ~~~ php think make:listener SwooleTask ~~~ ~~~ php think make:listener SwooleTaskFinish ~~~ 在`event.php`加入如下代码: ~~~ // 事件定义文件 return [ 'bind' => [ ], 'listen' => [ 'AppInit' => [], 'HttpRun' => [], 'HttpEnd' => [], 'LogLevel' => [], 'LogWrite' => [], 'swoole.task'=>['\app\listener\SwooleTask'], 'swoole.finish'=>['\app\listener\SwooleTaskFinish'], ], 'subscribe' => [ ], ]; ~~~ <details> <summary>SwooleTask.php</summary> ~~~ <?php declare (strict_types=1); namespace app\listener; use Swoole\Server\Task; class SwooleTask { /** * 事件监听处理 * * @return mixed */ public function handle(Task $task) { var_dump('on task'); var_dump($task->data);//task的data数据即server->task()传入的数据 $task->finish($task->data);//这里必须手动执行finish,否则不会触发onFinish监听事件 return ; } } ~~~ </details> <details> <summary>SwooleTaskFinish.php</summary> ~~~ <?php declare (strict_types=1); namespace app\listener; class SwooleTaskFinish { /** * 事件监听处理 * * @return mixed */ public function handle($event) { var_dump('task finish'); var_dump($event[2]);//这里的第三个索引才是onTask传入的data数据 return ; } } ~~~ </details> `controller`中实现`task`投递 ~~~ <?php namespace app\controller; use app\BaseController; use Swoole\Server; class Index extends BaseController { public function index(Server $server) { $server->task(['test'=>'test value']); return ; } } ~~~ 测试如下:访问接口地址输出控制台输出如下结果 ![](https://img.kancloud.cn/87/22/8722406a12fe690c8b85b5b9740bd9bd_396x220.png)