# task 通过加载器加载并返回一个task的代理。 函数原型 ```php /** * 获取一个task * @param $task * @return mixed|null|TaskProxy * @throws SwooleException */ public function task($task) ``` 其中$task是Task的类名,根据SD的传统该类优先在app/Tasks中寻找,如果不存在则在Server/Tasks中寻找。 例子: ```php 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 ```php /** * 开始异步任务 */ function startTask($callback,$id = -1) ``` * startTaskWait ```php /** * 开始同步任务 */ function startTaskWait($timeOurt = 0.5, $id = -1) ``` ## Controller和Model中的用法 AppTask.php ```php class AppTask extends Task { public function testTask() { return "test task\n"; } } ``` AppController.php ```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中 ```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', ]; ``` ## 协程模式 示例: ```php $task = $this->loader->task('TestTask'); $task->test(); $result = yield $task->coroutineSend(); ``` 使用协程会大大简化代码的书写,提高代码的可读性。 上面的代码通过yield关键字返回了异步回调的值。 _ **如果你的task是没有结果返回的,请不要用协程,这样会超时。**_ ##Task层级 1.7.4版本支持深层级的Task。 ```php $this->testTask = $this->loader->task('Test/TestTask'); ``` 如上会调用Test目录下TestTask,请注意命名空间的规范。 在1.7.4版本之前需要这样 ```php $this->testTask = $this->loader->task('Test\\TestTask');