协程风格服务

Hyperf 默认使用的是 Swoole 异步风格,此类型为多进程模型,自定义进程为单独进程运行。

此类型在使用 SWOOLE_BASE 且不使用自定义进程时,会以单进程模型来跑,具体可查看 Swoole 官方文档。

Hyperf 还提供了协程风格服务,此类型为单进程模型,所有的自定义进程会全部以协程模式来跑,不会创建单独的进程。

此两种风格,可以按需选择,但不推荐将已经在正常使用的服务,进行无脑切换

配置

修改 autoload/server.php 配置文件,设置 typeHyperf\Server\CoroutineServer::class 即可启动协程风格。

  1. <?php
  2. declare(strict_types=1);
  3. use Hyperf\Server\Event;
  4. use Hyperf\Server\Server;
  5. return [
  6. 'type' => Hyperf\Server\CoroutineServer::class,
  7. 'servers' => [
  8. [
  9. 'name' => 'http',
  10. 'type' => Server::SERVER_HTTP,
  11. 'host' => '0.0.0.0',
  12. 'port' => 9501,
  13. 'sock_type' => SWOOLE_SOCK_TCP,
  14. 'callbacks' => [
  15. Event::ON_REQUEST => [Hyperf\HttpServer\Server::class, 'onRequest'],
  16. ],
  17. ],
  18. ],
  19. ];

WebSocket

  1. 因为协程风格和异步风格,在对应的回调上存在差异,所以需要按需使用

例如 onReceive 回调,异步风格是 Swoole\Server,协程风格是 Swoole\Coroutine\Server\Connection

  1. <?php
  2. declare(strict_types=1);
  3. namespace Hyperf\Contract;
  4. use Swoole\Coroutine\Server\Connection;
  5. use Swoole\Server as SwooleServer;
  6. interface OnReceiveInterface
  7. {
  8. /**
  9. * @param Connection|SwooleServer $server
  10. */
  11. public function onReceive($server, int $fd, int $reactorId, string $data): void;
  12. }
  1. 中间件所在协程只有在 onClose 时,才会结束

因为 Hyperf 的数据库实例,是在协程销毁时,返还给连接池,所以如果在 WebSocket 的中间件中使用 Database 就会导致连接池内的连接无法正常归还。