后台任务

说明

在后台任务中,因为是运行在task进程,所以无法使用协程和协程客户端。如果你要操作数据库或Redis,一定要配置同步的连接池。

配置

项目配置文件中mainServer.configs.task_worker_num一定要配置为大于0,否则无法使用后台任务。

定义任务执行类

  1. <?php
  2. namespace Test;
  3. use Imi\Task\TaskParam;
  4. use Imi\Task\Interfaces\ITaskHandler;
  5. class Test implements ITaskHandler
  6. {
  7. /**
  8. * 任务处理方法
  9. * @param TaskParam $param
  10. * @param \Swoole\Server $server
  11. * @param integer $taskID
  12. * @param integer $WorkerID
  13. * @return void
  14. */
  15. public function handle(TaskParam $param, \Swoole\Server $server, int $taskID, int $WorkerID)
  16. {
  17. // 投递任务时的数据
  18. $data = $param->getData();
  19. }
  20. /**
  21. * 任务结束时触发
  22. * @param \swoole_server $server
  23. * @param int $taskId
  24. * @param mixed $data
  25. * @return void
  26. */
  27. public function finish(\Swoole\Server $server, int $taskID, $data)
  28. {
  29. }
  30. }

类名无所谓,实现ITaskHandler接口和两个方法即可。

投递任务

投递异步任务

  1. TaskManager::post(new TaskInfo(
  2. // 上面定义的类的实例
  3. new TestTask,
  4. // 执行任务的参数,构造方法可以接收一个数组
  5. new TaskParam([
  6. 'time' => time(),
  7. ])
  8. ));

调用后立即返回,不影响下面代码的执行

同步投递任务

  1. TaskManager::postWait(new TaskInfo(
  2. // 上面定义的类的实例
  3. new TestTask,
  4. // 执行任务的参数,构造方法可以接收一个数组
  5. new TaskParam([
  6. 'time' => time(),
  7. ]),
  8. // 最长等待时间,单位:秒
  9. 0.5
  10. ));

投递任务后阻塞等待执行完毕或超时,返回值为任务执行结果或false

协程批量投递任务

  1. TaskManager::postCo([new TaskInfo(
  2. // 上面定义的类的实例
  3. new TestTask,
  4. // 执行任务的参数,构造方法可以接收一个数组
  5. new TaskParam([
  6. 'time' => time(),
  7. ])
  8. )],
  9. // 最长等待时间,单位:秒
  10. 0.5);

传入数组和超时时间,投递后挂起协程,当全部执行完毕或超时后返回结果。返回值为数组,对应每个任务的执行结果。

注解

定义任务执行类

  1. <?php
  2. namespace Test;
  3. use Imi\Task\TaskParam;
  4. use Imi\Task\Interfaces\ITaskHandler;
  5. /**
  6. * @Task("testTask")
  7. */
  8. class Test implements ITaskHandler
  9. {
  10. /**
  11. * 任务处理方法
  12. * @param TaskParam $param
  13. * @param \Swoole\Server $server
  14. * @param integer $taskID
  15. * @param integer $WorkerID
  16. * @return void
  17. */
  18. public function handle(TaskParam $param, \Swoole\Server $server, int $taskID, int $WorkerID)
  19. {
  20. // 投递任务时的数据
  21. $data = $param->getData();
  22. }
  23. /**
  24. * 任务结束时触发
  25. * @param \swoole_server $server
  26. * @param int $taskId
  27. * @param mixed $data
  28. * @return void
  29. */
  30. public function finish(\Swoole\Server $server, int $taskID, $data)
  31. {
  32. }
  33. }

类名无所谓,实现ITaskHandler接口和两个方法即可。

投递任务

投递异步任务

  1. TaskManager::nPost(
  2. // 任务名称
  3. 'testTask'
  4. // 任务参数
  5. , [
  6. 'time' => time(),
  7. ]
  8. );

调用后立即返回,不影响下面代码的执行

同步投递任务

  1. TaskManager::nPostWait(new TaskInfo(
  2. // 任务名称
  3. 'testTask'
  4. // 任务参数
  5. , [
  6. 'time' => time(),
  7. ]
  8. // 最长等待时间,单位:秒
  9. 0.5
  10. ));

投递任务后阻塞等待执行完毕或超时,返回值为任务执行结果或false

协程批量投递任务

  1. TaskManager::postWait([
  2. ['testTask', ['time'=>time()]],
  3. ['testTask', ['time'=>time()]],
  4. ],
  5. // 最长等待时间,单位:秒
  6. 0.5);