Swoole学习笔记(三):HttpServer
admin
2023-01-27 19:10:09
0

1.SW的HttpServer
HttpServer的本质仍然是swoole_server,其协议加些部分固定使用Http协议解析,支持同步和异步2种模式
Swoole学习笔记(三):HttpServer
完整的HTTP协议请求会被封装在swoole_http_request对象内,所有HTTP响应都会通过swoole_http_response对象进行封装和发送
无论是同步模式还是异步模式,HttpServer都可以维持大量TCP客户端连接。同步/异步仅仅体现在对请求的处理方式上。
示例:

use Swoole\Http\Server;
$http = new Server("127.0.0.1", 9501);
$http->on('request', function ($request, $response) {
    $response->end("

Hello Swoole. #".rand(1000, 9999)."

"); }); $http->start();

2.回调函数onRequest事件
函数原型:function(swoole_http_request $request, swoole_http_response $response)
示例:

$http_server->on('request', function(swoole_http_request $request, swoole_http_response $response) {
     $response->end("

hello swoole

"); })

在收到一个完整的Http请求后,会回调此函数。回调函数共有2个参数:
$request,Http请求信息对象,包含了header/get/post/cookie等相关信息
$response,Http响应对象,支持cookie/header/status等Http操作
在onRequest回调函数返回时底层会销毁$request和$response对象,如果未执行$response->end()操作,底层会自动执行一次$response->end("")
需要注意的是,将$request/$response传递给其他函数时,不要采用引用的方式。在正常情况下,在一个请求流程结束后,这两个对象的引用次数会被置为0,对象能正常被销毁。如果有额外的引用的话,那么对象便不能被销毁,会造成OOM。当需要传递引用时,一定要在请求的最后unset掉这两个变量。

3.Request
Http请求对象,保存了Http客户端请求的相关信息,包括GET、POST、COOKIE、Header等;
1)Http\Request->$header
请求的头部信息。类型为数组,所有key均为小写。

echo $request->header['host'];
echo $request->header['accept-language'];

2)Http\Request->$server
Http请求相关的服务器信息,相当于PHP的$_SERVER数组。包含了Http请求的方法,URL路径,客户端IP等信息。
数组的key全部为小写,并且与PHP的$_SERVER数组保持一致
echo $request->server['request_time'];
3)Http\Request->$get
请求的GET参数,相当于PHP中的$_GET,格式为数组。
echo $request->get['hello'];
注意:为防止HASH***,GET参数最大不允许超过128个
4)Http\Request->$post
POST参数,格式为数组。
echo $request->post['hello'];
注意:POST与Header加起来的尺寸不得超过package_max_length的设置,否则会认为是恶意请求;同样的,POST参数的个数最大不超过128个
5)Http\Request->$cookie
HTTP请求携带的COOKIE信息,格式为键值对数组。
echo $request->cookie['username'];
6)Http\Request->$files
文件上传信息。类型为以form名称为key的二维数组。与PHP的$_FILES相同。最大文件尺寸不得超过package_max_length设置的值。
示例:
[
[name] => facepalm.jpg, //浏览器上传时传入的文件名称
[type] => image/jpeg, //MIME类型
[tmp_name] => /tmp/swoole.upfile.n3FmFr,//上传的临时文件,文件名以/tmp/swoole.upfile开头
[error] => 0,//文件尺寸
[size] => 15476
]
7)Http\Request->rawContent
获取原始的POST包体,用于非application/x-www-form-urlencoded格式的Http POST请求,如application/json。
8)Http\Request->getData
获取完整的原始Http请求报文。包括Http Header和Http Body
function swoole_http_request->getData() : string

4.Response
Http响应对象,通过调用此对象的方法,实现Http响应发送。
当Response对象销毁时,如果未调用end发送Http响应,底层会自动执行end
1)Http\Response->header
设置HTTP响应的Header信息。
function Http\Response->header(string $key, string $value, bool $ucwords = true);
$key,Http头的Key;$value,Http头的Value;$ucwords 是否需要对Key进行Http约定格式化,默认true会自动格式化
注意事项:
header设置必须在end方法之前
$key必须完全符合Http的约定,每个单词首字母大写,不得包含中文,下划线或者其他特殊字符
$value必须填写
$ucwords 设为true,swoole底层会自动对$key进行约定格式化
2)Http\Response->cookie
设置HTTP响应的cookie信息。此方法参数与PHP的setcookie完全一致。
function Http\Response->cookie(string $key, string $value = '', int $expire = 0 , string $path = '/', string $domain = '', bool $secure = false , bool $httponly = false);
注意事项:
底层自动会对$value进行urlencode编码,可使用rawCookie关闭对$value的编码处理;底层允许设置多个相同$key的COOKIE
3)Http\Response->status
发送Http状态码。
swoole_http_response->status(int $http_status_code);
注意事项:
$http_status_code必须为合法的HttpCode,如200, 502, 301, 404等,否则会报错
4)Http\Response->redirect
发送Http跳转。调用此方法会自动end发送并结束响应。参数$http_code:状态码,默认为302临时跳转,传入301表示永久跳转
function Http\Response->redirect(string $url, int $http_code = 302);
5)Http\Response->sendfile
发送文件到浏览器。
function Http\Response->sendfile(string $filename, int $offset = 0, int $length = 0);
$filename 要发送的文件名称,文件不存在或没有访问权限sendfile会失败
底层无法推断要发送文件的MIME格式因此需要应用代码指定Content-Type
调用sendfile前不得使用write方法发送Http-Chunk
调用sendfile后底层会自动执行end
sendfile不支持gzip压缩
$offset 上传文件的偏移量,可以指定从文件的中间部分开始传输数据。此特性可用于支持断点续传。
$length 发送数据的尺寸,默认为整个文件的尺寸
6)Http\Response->write
启用Http Chunk分段向浏览器发送相应内容。关于Http Chunk可以参考Http协议标准文档。
bool Http\Response->write(string $data);
$data要发送的数据内容,最大长度不得超过2M,受buffer_output_size配置项控制
使用write分段发送数据后,end方法将不接受任何参数
调用end方法后会发送一个长度为0的Chunk表示数据传输完毕
7)Http\Response->end
发送Http响应体,并结束请求处理。
function Http\Response->end(string $html);
end操作后将向客户端浏览器发送HTML内容
end只能调用一次,如果需要分多次向客户端发送数据,请使用write方法
客户端开启了KeepAlive,连接将会保持,服务器会等待下一次请求
客户端未开启KeepAlive,服务器将会切断连接

8)nginx反向代理
可以用swoole处理php请求,nginx处理静态资源,css,图片等等

server {
    listen 80;
    server_name swoole.test;
    index index.html index.htm index.php
    root /path/to/project

    location / {
        if (!-e $request_filename) {
            rewrite ^/(.*)$ /index.php/$1 last;
            break;
        }
    }

    location /Public {
        root /path/to/project
    }

    location ~ \.ico {
        root /path/to/project
    }

    location ~ \.php {
        proxy_pass http://127.0.0.1:9501;
    }
}

相关内容

热门资讯

德国总理:美国正在被伊朗羞辱 德国之声4月27日报道,德国总理默茨在访问一所学校时表示,在当前的持续冲突中,伊朗领导层正试图羞辱美...
理响中国|“长”歌以行,风云激... 光阴如梭,东方潮阔。这里是中国的长三角,世界的长三角。无论过去、现在还是未来,这片土地都因时代而生,...
白宫:特朗普及其国安团队开会讨... 新华社华盛顿4月27日电 美国白宫新闻秘书莱维特27日在记者会上证实,总统特朗普及其国家安全团队当天...
人民日报刊文:日本放开杀伤性武... 日本放开杀伤性武器出口推高地缘冲突风险(国际论坛)常思纯《人民日报》(2026年04月28日 第 0...
医疗保障法草案二审:明确生育保... 满足多样化健康保障需求本报记者 彭 波4月27日,医疗保障法草案二审稿提请十四届全国人大常委会第二十...
天津一景区发生自转旋翼机事故1... 澎湃新闻记者 吕新文中国民用航空华北地区管理局4月22日公布《豪客通航“10•1”天津长芦汉盐旅游区...
卡塔尔埃米尔与美国总统特朗普通... 当地时间24日,卡塔尔埃米尔塔米姆与美国总统特朗普通电话,重点就中东地区局势以及伊朗与美国谈判问题交...
男子30年前被扣押2859克黄... 澎湃新闻记者 王鑫家住辽宁省大连市的潘永嘉近日向澎湃新闻反映称,三十年前,他在大连周水子机场被盖州市...
商务部:取消反制欧盟两家金融机... 中华人民共和国商务部令二〇二六年 第1号鉴于欧盟已取消对中国两家金融机构的制裁措施,现公布《关于取消...
过去24小时共有5艘船只通过霍... 总台记者当地时间24日获悉,过去24小时内,共有5艘船只通过霍尔木兹海峡,其中包括一艘伊朗油轮。(总...