HTTP服务器
优质
小牛编辑
136浏览
2023-12-01
?> 完全协程化的Http服务器实现,Co\Http\Server
继承自Co\Server,在此不再赘述,只说差异。
与 Http\Server 的不同之处:
- 可以在运行时动态地创建、销毁
- 对连接的处理是在单独的子协程中完成,客户端连接的
Connect
、Request
、Response
、Close
是完全串行的
!> 需要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();
});