Hyperf-Task使用
下载task组件
composer require hyperf/task
配置
因为 Task 并不是默认组件,所以在使用的时候需要在 server.php
增加 Task
相关的配置。
<?php
declare(strict_types=1);
use Hyperf\Server\Event;
return [
// 这里省略了其它不相关的配置项
'settings' => [
// Task Worker 数量,根据您的服务器配置而配置适当的数量
'task_worker_num' => 8,
// 因为 `Task` 主要处理无法协程化的方法,所以这里推荐设为 `false`,避免协程下出现数据混淆的情况
'task_enable_coroutine' => false,
],
'callbacks' => [
// Task callbacks
Event::ON_TASK => [Hyperf\Framework\Bootstrap\TaskCallback::class, 'onTask'],
Event::ON_FINISH => [Hyperf\Framework\Bootstrap\FinishCallback::class, 'onFinish'],
],
];
执行器使用:
官方推荐使用注解方法,task执行器比较麻烦 ;
先创建一个task服务使用执行器调用
<?php
namespace App\Task;
class TaskService
{
public function task(int $time = 1000):bool
{
return $this->send($time);
}
public function send(int $time):bool
{
swoole_timer_tick($time, function ($timerIds) {
$rand = $this->rand();
echo '输出-'.$rand.PHP_EOL;
if ($rand === 5) {
swoole_timer_clear($timerIds);
}
});
echo "执行完毕".PHP_EOL;
return true;
}
public function rand():int
{
return rand(1, 9);
}
}
执行器调用
$container = ApplicationContext::getContainer();
$exec = $container->get(TaskExecutor::class);
$exec->execute(new Task([TaskService::class, 'task'], [Coroutine::id()]));
namespace App\Task;
use Hyperf\Task\Annotation\Task;
use Hyperf\Utils\Coroutine;
class TaskService
{
/**
* @Task()
*/
public function task(int $time = 1000):bool
{
return $this->send($time);
}
public function send(int $time):bool
{
swoole_timer_tick($time, function ($timerIds) {
$rand = $this->rand();
echo '输出-'.$rand.PHP_EOL;
if ($rand === 5) {
swoole_timer_clear($timerIds);
}
});
echo "执行完毕".PHP_EOL;
return true;
}
public function rand():int
{
return rand(1, 9);
}
}
调用
/**
* @Inject()
* @var TaskService
*/
protected $task;
public function index()
{
$this->task->task();
}
- 版权申明:此文如未标注转载均为本站原创,自由转载请表明出处《龙行博客》。
- 本文网址:https://www.liaotaoo.cn/417.html
- 上篇文章:PHP生成唯一RequestID类
- 下篇文章:Hyper服务消费者统一响应