当前位置: 首页 > 文档资料 > Swoole 中文文档 >

HTTP服务器

优质
小牛编辑
136浏览
2023-12-01

?> 完全协程化的Http服务器实现,Co\Http\Server继承自Co\Server,在此不再赘述,只说差异。

Http\Server 的不同之处:

  • 可以在运行时动态地创建、销毁
  • 对连接的处理是在单独的子协程中完成,客户端连接的ConnectRequestResponseClose是完全串行的

!> 需要v4.4.0或更高版本

!> 若编译时开启HTTP2,则默认会启用HTTP2协议支持,无需像Swoole\Http\Server一样配置open_http2_protocol (注: v4.4.16以下版本HTTP2支持存在已知BUG, 请升级后使用)

短命名

可使用Co\Http\Server短名。

方法

handle()

覆盖父类的handle方法,处理http请求。

Swoole\Coroutine\Http\Server->handle(string $pattern, callable $fn): void;

!> 必须在 Server::start 之前设置处理函数

  • 参数

    • string $pattern

      • 功能:设置URL路径【如/index.html,注意这里不能传入http://domain
      • 默认值:无
      • 其它值:无
    • callable $fn

      • 功能:处理函数,用法参考Swoole\Http\Server中的OnRequest回调,在此不再赘述
      • 默认值:无
      • 其它值:无

      示例:

      function callback(Swoole\Http\Request $req, Swoole\Http\Response $resp) {
          $resp->end("hello world");
      }
  • 提示

    • 服务器在Accept(建立连接)成功后,会自动创建协程并接受Http请求
    • $fn是在新的子协程空间内执行,因此在函数内无需再次创建协程
    • 客户端支持KeepAlive,子协程会循环继续接受新的请求,而不退出
    • 客户端不支持KeepAlive,子协程会停止接受请求,并退出关闭连接
  • 注意

    !> -$pattern设置相同路径时,新的设置会覆盖旧的设置;
    -未设置/根路径处理函数并且请求的路径没有找到任何匹配的$pattern,Swoole将返回404错误;
    -$pattern使用字符串匹配的方法,不支持通配符和正则,不区分大小写,匹配算法是前缀匹配,例如:url是/test111会匹配到/test这个规则,匹配到即跳出匹配忽略后面的配置;
    -推荐设置/根路径处理函数,并在回调函数中使用$request->server['request_uri']进行请求路由。

完整示例

Co\run(function () {
    $server = new Co\Http\Server("127.0.0.1", 9502, false);
    $server->handle('/', function ($request, $response) {
        $response->end("<h1>Index</h1>");
    });
    $server->handle('/test', function ($request, $response) {
        $response->end("<h1>Test</h1>");
    });
    $server->handle('/stop', function ($request, $response) use ($server) {
        $response->end("<h1>Stop</h1>");
        $server->shutdown();
    });
    $server->start();
});