四、Swoole 基础学习笔记 - 启动一个 Swoole HTTP 服务器

作者: 温新

分类: 【Swoole 系列】

阅读: 1105

时间: 2023-01-11 12:46:03

hi,我是温新,一名PHPer

文章基于 Swoole 5.0 版本编写。

学习目标:学习 Swoole Http Server 及相关知识。

说明:本篇文章结合官方文档编写及参考网络资料编写,虽非全部原创,但也是结合了自己的理解,若转载请附带本文 URL,编写不易,持续编写更不易,谢谢!

经过上一篇文章的洗刷后,我们再来看看 Swoole 的另一个功能——HTTP服务器,跑一个 HTTP 服务器来环境来缓解一下气氛。

Swoole 内置实现了一个简单的 HttpServer 类,相当于 php-fmp,其优势在于高性能,将代码载入内存,后续无需解释执行。由于 Http\ServerHTTP 协议的支持并不完整,建议仅作为应用服务器,用于处理动态请求,并且在前端增加 Nginx 作为代理。在实际生产环境中,在前端增加一层 Nginx,一些静态文件(css/js)等交给 Nginx,而 PHP 文件则交给 Swoole 来处理。

Swoole http 是如何处理请求的

来看看流程图,如下:

4-1 swoole-http.jpg

1、Http/Server 在协议解析部分使用的是 Http 协议;

2、http 协议请求会被封装中 Swoole\Http\Request 对象中,如请求参数,要从这里获取;

3、所有的 http 响应都要通过 Swoole\Http\Response 对象进程封装和发送。

学习了这些,再来看看运行 http server。

先把 Web 服务器运行起来

他用 swoole 创建一个异步非阻塞多进程的 Http 服务器。

<span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important"><?</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">php</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(98, 151, 85) !important">// 2-swoole-http.php</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    </span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(98, 151, 85) !important">// 实例化 http server 对象</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$http</span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span> <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">new</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Swoole\Http\Server</span>(<span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">'0.0.0.0'</span>, <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">9501</span>);</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(98, 151, 85) !important">// 监听网络请求</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$http</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">-></span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">on</span>(<span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">'Request'</span>, <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">function</span> (<span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$request</span>, <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$response</span>) {</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(98, 151, 85) !important">// 处理/响应请求</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$response</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">-></span><span style="box-sizing: border-box;color: rgb(232, 191, 106) !important">header</span>(<span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">'Content-Type'</span>, <span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">'text/html; charset=utf-8'</span>);</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$response</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">-></span><span style="box-sizing: border-box;color: rgb(232, 191, 106) !important">end</span>(<span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">'<h1>Hello Swoole. #'</span> . <span style="box-sizing: border-box;color: rgb(232, 191, 106) !important">rand</span>(<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">1000</span>, <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">9999</span>) . <span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">'</h1>'</span>);</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">});</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(98, 151, 85) !important">// 启动 http server</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$http</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">-></span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">start</span>();</span>

解读一下代码,通过 Swoole\Http\Server 传递两个参数,实例化出一个 http 对象,然后监听 Request ,其回调函数接收两个参数,Swoole\Http\Request(请求)Swoole\Http\Response (响应)。如下是官方说明:

HTTP 服务器只需要关注请求响应即可,所以只需要监听一个 onRequest 事件。当有新的 HTTP 请求进入就会触发此事件。事件回调函数有 2 个参数,一个是 $request 对象,包含了请求的相关信息,如 GET/POST 请求的数据。

另外一个是 response 对象,对 request 的响应可以通过操作 response 对象来完成。$response->end() 方法表示输出一段 HTML 内容,并结束此请求。

现在请求服务,并在浏览器中输入 localhost:9501 就可以看到页面信息了。

运行 Swoole Http 还远远不够

http 协议有两个动作:请求响应,Swoole Http Server 也是如此。服务器运行起来后,该如何处理这两个动作?下面继续学习。

Swoole/Http/Request

作用:负责处理 http 请求的相关信息。

既然知道了 request 是处理请求相关的,那么它有哪些内容?现在把 $request 打印出来看看,它是什么:

<span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(98, 151, 85) !important">// 省略其他内容</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$http</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">-></span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">on</span>(<span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">'Request'</span>, <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">function</span> (<span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$request</span>, <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$response</span>) {</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(232, 191, 106) !important">print_r</span>(<span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$request</span>);</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(98, 151, 85) !important">// ...</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">});</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(98, 151, 85) !important">// ...</span></span>

通过打印的结果,可以看到它是一个 Swoole\Http\Request Object 对象,这个对象中包含了很多信息,有 header、server、cookie、get、post、files 等,

<span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Swoole\Http\Request</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Object</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">(</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    [<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">fd</span>] <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=></span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">1</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    [<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">streamId</span>] <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=></span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">0</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    [<span style="box-sizing: border-box;color: rgb(232, 191, 106) !important">header</span>] <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=></span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Array</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">        (</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">            [<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">host</span>] <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=></span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">localhost</span>:<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">9501</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">            [<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">connection</span>] <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=></span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">keep</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">-</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">alive</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">            [<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">sec</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">-</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">ch</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">-</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">ua</span>] <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=></span> <span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">"Google Chrome"</span>;<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">v</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span><span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">"107"</span>, <span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">"Chromium"</span>;<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">v</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span><span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">"107"</span>, <span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">"Not=A?Brand"</span>;<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">v</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span><span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">"24"</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">            [<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">sec</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">-</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">ch</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">-</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">ua</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">-</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">mobile</span>] <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=></span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">?</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">0</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">            [<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">user</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">-</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">agent</span>] <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=></span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Mozilla</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">/</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">5.0</span> (<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">X11</span>; <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Linux</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">x86_64</span>) <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">AppleWebKit</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">/</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">537.36</span> (<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">KHTML</span>, <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">like</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Gecko</span>) <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Chrome</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">/</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">107.0</span>.<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">0.0</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Safari</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">/</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">537.36</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">            [<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">sec</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">-</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">ch</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">-</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">ua</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">-</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">platform</span>] <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=></span> <span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">"Linux"</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">            [<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">accept</span>] <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=></span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">image</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">/</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">avif</span>,<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">image</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">/</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">webp</span>,<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">image</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">/</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">apng</span>,<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">image</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">/</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">svg</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">+</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">xml</span>,<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">image</span><span style="box-sizing: border-box;color: rgb(98, 151, 85) !important">/*,*/</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">*</span>;<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">q</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">0.8</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">            [<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">sec</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">-</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">fetch</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">-</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">site</span>] <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=></span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">same</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">-</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">origin</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">            [<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">sec</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">-</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">fetch</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">-</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">mode</span>] <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=></span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">no</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">-</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">cors</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">            [<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">sec</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">-</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">fetch</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">-</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">dest</span>] <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=></span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">image</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">            [<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">referer</span>] <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=></span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">http</span>:<span style="box-sizing: border-box;color: rgb(98, 151, 85) !important">//localhost:9501/</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">            [<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">accept</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">-</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">encoding</span>] <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=></span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">gzip</span>, <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">deflate</span>, <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">br</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">            [<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">accept</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">-</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">language</span>] <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=></span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">zh</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">-</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">CN</span>,<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">zh</span>;<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">q</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">0.9</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">        )</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    [<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">server</span>] <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=></span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Array</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">        (</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">            [<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">request_method</span>] <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=></span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">GET</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">            [<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">request_uri</span>] <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=></span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">/</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">favicon</span>.<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">ico</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">            [<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">path_info</span>] <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=></span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">/</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">favicon</span>.<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">ico</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">            [<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">request_time</span>] <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=></span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">1669652656</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">            [<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">request_time_float</span>] <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=></span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">1669652656.2447</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">            [<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">server_protocol</span>] <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=></span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">HTTP</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">/</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">1.1</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">            [<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">server_port</span>] <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=></span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">9501</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">            [<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">remote_port</span>] <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=></span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">56526</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">            [<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">remote_addr</span>] <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=></span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">127.0</span>.<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">0.1</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">            [<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">master_time</span>] <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=></span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">1669652656</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">        )</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    [<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">cookie</span>] <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=></span> </span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    [<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">get</span>] <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=></span> </span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    [<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">files</span>] <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=></span> </span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    [<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">post</span>] <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=></span> </span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    [<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">tmpfiles</span>] <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=></span> </span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">)</span>

想想以前接收 get 请求参数是使用 $_GET,而在 Swoole 中,这些超全局变量全部失效。以下是官方说明:

协程使得原有的异步逻辑同步化,但是在协程的切换是隐式发生的,所以在协程切换的前后不能保证全局变量以及 static 变量的一致性。

PHP-FPM下可以通过全局变量获取到请求的参数,服务器的参数等,在 Swoole 内,无法 通过 $_GET/$_POST/$_REQUEST/$_SESSION/$_COOKIE/$_SERVER$_开头的变量获取到任何属性参数。

在 Swoole 中,可以使用如下方式处理请求:

<span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$_GET</span>    <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$request</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">-</span>>get;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$_POST</span>   <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$request</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">-</span>>post;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$_HEADER</span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$request</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">-</span>>header;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$_SERVER</span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$request</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">-</span>>server;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$_COOKIE</span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$request</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">-</span>>cookie;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$_FILES</span>  <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$request</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">-</span>>files;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$_CONTENT</span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$request</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">-</span>>rawContent;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$request</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">-</span>>getData;</span>

转换一个方式就很好理解了,这种方式不用多说,相信 PHPer 都已经非常熟悉了,下面了解一下注意事项,然后动手试试吧。

  • 1、Swoole Http/Server 可以接收 application/x-www-form-urlencodedform-data 数据,解析后数据会放在 $request 对象中。若是 application/json 数据,需要通过 getContent() 方法来接收;
  • 2、Post 上传文件时,需要设置临时文件位置且需要设置包的大小,文件最大尺寸受到package_max_length 限制,不上传大文件进行处理。当 $request 对象销毁时,会自动删除上传的临时文件。

Swoole/Http/Response

作用:负责响应 http 请求。响应信息包含:响应头信息、响应状态等,没有列出的方法请参考官方文档。

<span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Swoole\Http\Response</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">-></span><span style="box-sizing: border-box;color: rgb(232, 191, 106) !important">header</span>(<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">string</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$key</span>, <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">string</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$value</span>, <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">bool</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$format</span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">true</span>);</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Swoole\Http\Response</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">-></span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">cookie</span>(<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">string</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$key</span>, <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">string</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$value</span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span> <span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">''</span>, <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">int</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$expire</span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">0</span> , <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">string</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$path</span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span> <span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">'/'</span>, <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">string</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$domain</span>  <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span> <span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">''</span>, <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">bool</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$secure</span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">false</span> , <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">bool</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$httponly</span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">false</span>, <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">string</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$samesite</span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span> <span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">''</span>, <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">string</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$priority</span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span> <span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">''</span>);</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Swoole\Http\Response</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">-></span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">status</span>(<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">int</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$http_status_code</span>, <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">string</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$reason</span>): <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">bool</span></span>

压测 Swoole Http Server

了解了这么多,现在来看我们这服务进行压测看看,结果如下:

<span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$ab</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">-n</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">1000</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">-c</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">100</span>  http://localhost:9501/</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">Server Software:        swoole-http-server</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">Server Hostname:        localhost</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">Server Port:            <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">9501</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">Document Path:          /</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">Document Length:        <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">28</span> bytes</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">Concurrency Level:      <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">100</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">Time taken <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">for</span> tests:   <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">0</span>.030 seconds</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">Complete requests:      <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">1000</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">Failed requests:        <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">0</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">Total transferred:      <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">191000</span> bytes</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">HTML transferred:       <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">28000</span> bytes</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">Requests per second:    <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">33518</span>.80 [<span style="box-sizing: border-box;color: rgb(98, 151, 85) !important">#/sec] (mean)</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">Time per request:       <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">2</span>.983 [ms] (mean)</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">Time per request:       <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">0</span>.030 [ms] (mean, across all concurrent requests)</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">Transfer rate:          <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">6252</span>.04 [Kbytes/sec] received</span>

本篇文章到此结束,我是温新,我们下一篇文章见。

请登录后再评论