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)