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

results matching ""

    No results matching ""