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 ;
}
}
~~~
測試如下:訪問接口地址輸出控制臺輸出如下結果
