在 Server 程序中如果需要执行很耗时的操作,比如一个聊天服务器发送广播,Web 服务器中发送邮件。如果直接去执行这些函数就会阻塞当前进程,导致服务器响应变慢。Swoole 提供了异步任务处理的功能,可以投递一个异步任务到 TaskWorker 进程池中执行,不影响当前请求的处理速度。
hyperf微服务ask 组件主动方法投递示例
<?php declare(strict_types=1); namespace App\Task; use Hyperf\Task\Annotation\Task; use MongoDB\Driver\BulkWrite; use MongoDB\Driver\Manager; use MongoDB\Driver\Query; use MongoDB\Driver\WriteConcern; class MongoTask { /** * @var Manager */ public $manager; /** * @Task */ public function insert(string $namespace, array $document) { $writeConcern = new WriteConcern(WriteConcern::MAJORITY, 1000); $bulk = new BulkWrite(); $bulk->insert($document); $result = $this->manager()->executeBulkWrite($namespace, $bulk, $writeConcern); return $result->getUpsertedCount(); } /** * @Task */ public function query(string $namespace, array $filter = [], array $options = []) { $query = new Query($filter, $options); $cursor = $this->manager()->executeQuery($namespace, $query); return $cursor->toArray(); } protected function manager() { if ($this->manager instanceof Manager) { return $this->manager; } $uri = 'mongodb://127.0.0.1:27017'; return $this->manager = new Manager($uri, []); } }
使用
<?php declare(strict_types=1); namespace App\Controller; use App\Task\MongoTask; use Hyperf\Utils\ApplicationContext; class IndexController { public function test() { $client = ApplicationContext::getContainer()->get(MongoTask::class); $client->insert('hyperf.test', ['id' => rand(0, 99999999)]); $result = $client->query('hyperf.test', [], [ 'sort' => ['id' => -1], 'limit' => 5, ]); } }