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');

results matching ""

    No results matching ""