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版本之前需要这样
$this->testTask = $this->loader->task('Test\\TestTask');