task
通过加载器加载并返回一个task的代理。
函数原型
/**
* 获取一个task
* @param $task
* @return mixed|null|TaskProxy
* @throws SwooleException
*/
public function task($task)
其中$task是Task的类名,根据SD的传统该类优先在app/Tasks中寻找,如果不存在则在Server/Tasks中寻找。
例子:
public function test_task()
{
$testTask = $this->loader->task('TestTask');
$testTask->test();
$testTask->startTask(null);
}
需要注意$this->loader->task('TestTask')返回的并不是TestTask的实例,其实返回的是一个TaskProxy,这个TaskProxy是个单例模式,所以调用task的时候不要对TaskProxy缓存,随时用随时获取。
TestTask有个test方法,虽然说$testTask是个TaskProxy,但你可以把他当做是TestTask调用方法。
TaskProxy和Task的更加深入的用法见具体章节。
Task
Task是异步任务模块服务于controller和model。
1.7以后的版本,Task中可以使用协程,所以写法和Model基本一致。
Task类在task进程中是单例,每种类只会实例化一次。
TaskProxy
controller和model中获取的Task其实是TaskProxy
startTask
/** * 开始异步任务 */ function startTask($callback,$id = -1)
startTaskWait
/** * 开始同步任务 */ function startTaskWait($timeOurt = 0.5, $id = -1)
Controller和Model中的用法
AppTask.php
class AppTask extends Task
{
public function testTask()
{
return "test task\n";
}
}
AppController.php
class AppController extends Controller
{
public function http_test_task()
{
$AppTask = $this->loader->task('AppTask');
$AppTask->testTask();
$AppTask->startTask(function ($serv, $task_id, $data) {
$this->http_output->end($data);
});
}
}
TimerTask的用法
添加到配置文件timerTask.php中
$config['timerTask'][] = [
'task_name'=>'AppTask',
'method_name'=>'testTask',
'start_time'=>'Y-m-d 00:00:00',
'end_time'=>'Y-m-d 23:59:59',
'interval_time'=>'2',
];
协程模式
示例:
$task = $this->loader->task('TestTask');
$task->test();
$result = yield $task->coroutineSend();
使用协程会大大简化代码的书写,提高代码的可读性。
上面的代码通过yield关键字返回了异步回调的值。
如果你的task是没有结果返回的,请不要用协程,这样会超时。
Task层级
1.7.4版本支持深层级的Task。
$this->testTask = $this->loader->task('Test/TestTask');
如上会调用Test目录下TestTask,请注意命名空间的规范。
在1.7.4版本之前需要这样 ```php $this->testTask = $this->loader->task('Test\TestTask');