Swoole从入门到入土(12)——HTTP服务器[Response]
继上一节了解完请求对象之后,这一节我们着重了解响应对象(Response)。响应对象主要用于将数据发现到客户端。当 Response 对象销毁时,如果未调用 end 发送 HTTP 响应,底层会自动执行 end("")。
关于Response需要注意的是:千万不要使用 & 符号引用 Http\Response 对象。
1、函数
header():设置 HTTP 响应的 Header 信息
Swoole\Http\Response->header(string $key, string $value, bool $ucwords = true);
$key:HTTP 头的 Key
$value:HTTP 头的 value
$ucwords:是否需要对 Key 进行 HTTP 约定格式化【默认 true 会自动格式化】
返回值:设置失败,返回 false。设置成功,没有任何返回值。
注意:
- header 设置必须在 end 方法之前 -$key 必须完全符合 HTTP 的约定,每个单词首字母大写,不得包含中文,下划线或者其他特殊字符
- $value 必须填写
- $ucwords 设为 true,底层会自动对 $key 进行约定格式化
- 重复设置相同 $key 的 HTTP 头会覆盖,取最后一次
trailer():将 Header 信息附加到 HTTP 响应的末尾,仅在 HTTP2 中可用,用于消息完整性检查,数字签名等。
Swoole\Http\Response->trailer(string $key, string $value, bool $ucwords = true);
$key:HTTP 头的 Key
$value:HTTP 头的 value
$ucwords:是否需要对 Key 进行 HTTP 约定格式化【默认 true 会自动格式化】
返回值:设置失败,返回 false。设置成功,没有任何返回值。
注意:重复设置相同 $key 的 Http 头会覆盖,取最后一次。
cookier():设置 HTTP 响应的 cookie 信息。此方法参数与 PHP 的 setcookie 完全一致。
Swoole\Http\Response->cookie(string $key, string $value = '', int $expire = 0 , string $path = '/', string $domain = '', bool $secure = false , bool $httponly = false, string $samesite = '');
注意:
- cookie 设置必须在 end 方法之前
- $samesite 参数从 v4.4.6 版本开始支持
- Swoole 会自动会对 $value 进行 urlencode 编码,可使用 rawCookie() 方法关闭对 $value 的编码处理
- Swoole 允许设置多个相同 $key 的 COOKIE
rawCookie():设置 HTTP 响应的 cookie 信息,参数和上文的 cookie() 一致,只不过不进行编码处理
status():发送 Http 状态码。
Swoole\Http\Response->status(int $http_status_code, int $reason): bool
$http_status_code:设置 HttpCode
$reason:可设置任意 HttpCode
注意:
-如果只传入了第一个参数 $http_status_code 必须为合法的 HttpCode,如 200、502、301、404 等,否则会设置为 200 状态码
-如果设置了第二个参数 $reason,$http_status_code 可以为任意的数值,包括未定义的 HttpCode,如 499
-必须在 $response->end() 之前执行 status 方法
gzip():4.1.0后方法已废弃,故不展开说明
redirect():发送 Http 跳转。调用此方法会自动 end 发送并结束响应。
Swoole\Http\Response->redirect(string $url, int $http_code = 302): void
$url:跳转的新地址,作为 Location 头进行发送
$http_code:状态码【默认为 302 临时跳转,传入 301 表示永久跳转】
write():启用 Http Chunk 分段向浏览器发送相应内容。
Swoole\Http\Response->write(string $data): bool
$data:要发送的数据内容【最大长度不得超过 2M,受 buffer_output_size 配置项控制】
注意:使用 write 分段发送数据后,end 方法将不接受任何参数,调用 end 只是会发送一个长度为 0 的 Chunk 表示数据传输完毕。
sendfile():发送文件到浏览器。
Swoole\Http\Response->sendfile(string $filename, int $offset = 0, int $length = 0): bool
$filename:要发送的文件名称【文件不存在或没有访问权限 sendfile 会失败】
$offset:上传文件的偏移量【可以指定从文件的中间部分开始传输数据。此特性可用于支持断点续传】
$length:发送数据的尺寸【默认文件的尺寸】
注意:
-底层无法推断要发送文件的 MIME 格式因此需要应用代码指定 Content-Type
-调用 sendfile 前不得使用 write 方法发送 Http-Chunk
-调用 sendfile 后底层会自动执行 end
-sendfile 不支持 gzip 压缩
end():发送 Http 响应体,并结束请求处理。
Swoole\Http\Response->end(string $html): bool
$html:要发送的内容
注意:
-end 只能调用一次,如果需要分多次向客户端发送数据,请使用 write 方法
-客户端开启了 KeepAlive,连接将会保持,服务器会等待下一次请求
-客户端未开启 KeepAlive,服务器将会切断连接
detach():分离响应对象。使用此方法后,$response 对象销毁时不会自动 end,与 Http\Response::create 和 Server::send 配合使用。
Swoole\Http\Response->detach(): bool
注意:detach 方法只能在 SWOOLE_PROCESS 模式下使用。
示例1:某些情况下,需要在 Task 进程中对客户端发出响应。这时可以利用 detach 使 $response 对象独立。在 Task 进程可以重新构建 $response,发起 Http 请求响应。
$http = new Swoole\Http\Server("0.0.0.0", 9501); $http->set(['task_worker_num' => 1, 'worker_num' => 1]); $http->on('request', function ($req, Swoole\Http\Response $resp) use ($http) {
$resp->detach();
$http->task(strval($resp->fd));
}); $http->on('finish', function () {
echo "task finish";
}); $http->on('task', function ($serv, $task_id, $worker_id, $data) {
var_dump($data);
$resp = Swoole\Http\Response::create($data);
$resp->end("in task");
}); $http->start();
示例 2:某些特殊的场景下,需要对客户端发送特殊的响应内容。Http\Response 对象自带的 end 方法无法满足需求,可以使用 detach 分离响应对象,然后自行组装 HTTP 协议响应数据,并使用 Server::send 发送数据。
$http = new Swoole\Http\Server("0.0.0.0", 9501); $http->on('request', function ($req, Swoole\Http\Response $resp) use ($http) {
$resp->detach();
$http->send($resp->fd, "HTTP/1.1 200 OK\r\nServer: server\r\n\r\nHello World\n");
}); $http->start();
create():构造新的 Swoole\Http\Response 对象。
Swoole\Http\Response::create(int $fd): Swoole\Http\Response;
$fd:参数为需要绑定的连接 $fd【调用 Http\Response 对象的 end 与 write 方法时会向此连接发送数据】
返回值:调用成功返回一个新的 Http\Response 对象,调用失败返回 false
注意:使用此方法前请务必调用 detach 方法将旧的 $response 对象分离,否则可能会造成对同一个请求发送两次响应内容。
示例:
$http = new Swoole\Http\Server("0.0.0.0", 9501); $http->on('request', function ($req, Swoole\Http\Response $resp) use ($http) {
$resp->detach();
$resp2 = Swoole\Http\Response::create($req->fd);
$resp2->end("hello world");
}); $http->start();
关于Http服务器响应对象的成员函数就以上这些,接下来将会疏理Http服务器的特有配置。
--------------------------- 我是可爱的分割线 ----------------------------
最后博主借地宣传一下,漳州编程小组招新了,这是一个面向漳州青少年信息学/软件设计的学习小组,有意向的同学点击链接,联系我吧。
Swoole从入门到入土(12)——HTTP服务器[Response]的更多相关文章
- Oracle数据库基础入门《一》Oracle服务器的构成
Oracle数据库基础入门<一>Oracle服务器的构成 Oracle 服务器是一个具有高性能和高可靠性面向对象关系型数据库管理系统,也是一 个高效的 SQL 语句执行环境. Oracle ...
- Hexo结合Stun静态博客搭建从入门到入土
摘要 安装npm,安装hexo相关依赖,安装主题stun 修改hexo配置,修改stun配置,部署到github,gitee实现静态访问 给博客加上全局搜索,访问量统计 hexo博客编写模板 tips ...
- QT从入门到入土(一)——Qt5.14.2安装教程和VS2019环境配置
引言 24岁的某天,承载着周围人的关心,一路南下.天晴心静,听着斑马,不免对未来有些彷徨.但是呢,人生总要走陌生的路,看陌生的风景,所幸可以听着不变的歌,关心自己的人就那么多.就像是对庸常生活的一次越 ...
- QT从入门到入土(三)——信号和槽机制
摘要 信号槽是 Qt 框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号 (signal).这种发出是没有目的的,类似广播 ...
- RocketMQ入门到入土(二)事务消息&顺序消息
接上一篇:RocketMQ入门到入土(一)新手也能看懂的原理和实战! 一.事务消息的由来 1.案例 引用官方的购物案例: 小明购买一个100元的东西,账户扣款100元的同时需要保证在下游的积分系统给小 ...
- QT从入门到入土(二)——对象模型(对象树)和窗口坐标体系
摘要 我们使用的标准 C++,其设计的对象模型虽然已经提供了非常高效的 RTTI 支持,但是在某些方面还是不够灵活.比如在 GUI 编程方面,既需要高效的运行效率也需要强大的灵活性,诸如删除某窗口时可 ...
- QT从入门到入土(四)——多线程(QtConcurrent::run())
引言 在前面对Qt多线程(QThread)做了详细的分析:QT从入门到入土(四)--多线程(QThread) - 唯有自己强大 - 博客园 (cnblogs.com) 但是最近在做项目时候,要将一个函 ...
- COM编程入门第二部分——深入COM服务器
本文为刚刚接触COM的程序员提供编程指南,解释COM服务器内幕以及如何用C++编写自己的接口.继上一篇COM编程入门之后,本文将讨论有关 COM服务器的内容,解释编写自己的COM接口和COM服务器所需 ...
- Linux入门(三)搭建服务器linux运行环境LAMP/LNMP
本文内容主要根据慕课网教学视频整理,原链接http://www.imooc.com/learn/170 我用的linux系统是ubuntu 12.04 LTS 虚拟机是VMware Workstat ...
- SuperSocket入门(一)-Telnet服务器和客户端请求处理
本文的控制台项目是根据SuperSocket官方Telnet示例代码进行调试的,官方示例代码:Telnet示例. 开始我的第一个Telnet控制台项目之旅: 创建控制台项目:打开vs程序,文件=> ...
随机推荐
- 2023浙江省大学生信息安全竞赛技能赛初赛 部分wp
CRYPTO 小小数学家 1.题目信息 查看代码 19+49=? 96-31=? 86-3=? 20+47=? 29+55=? 35+35=? 81+42=? 73-16=? 52+48=? 0+56 ...
- Laravel - Eloquent 删除数据
public function ormDelete() { # 1.通过模型删除 // $student = Student::where('id',5 ...
- [转帖]MioIO读/写性能测试
https://www.jianshu.com/p/a0a84f91b16f image.png COSBench是Intel团队基于java开发,是一个测试云对象存储系统的分布式基准测试工具,全 ...
- [转帖]浅谈RAID写惩罚(Write Penalty)与IOPS计算
https://www.dell.com/community/%E6%95%B0%E6%8D%AE%E5%AD%98%E5%82%A8%E5%92%8C%E4%BF%9D%E6%8A%A4-%E8%B ...
- [转帖]linux系统下grub.cfg详解和实例操作
linux系统下grub.cfg详解和实例操作 简介 grub是引导操作系统的程序,它会根据自己的配置文件,去引导内核,当内核被加载到内存以后,内核会根据grub配置文件中的配置,找到根分区所使用的文 ...
- shell补遗_一个巨简单的保证服务存活的脚本
Shell补遗 背景 公司一台机器总是会在没有更新补丁的情况下启动失败. 查看所有的配置都没有问题. 但是就是不启动 没办法,准备写一个检查进行启动. 最近写shell很少. 所以总结一下. 思路 判 ...
- [转帖]Nginx Ingress 高并发实践
概述 Nginx Ingress Controller 基于 Nginx 实现了 Kubernetes Ingress API,Nginx 是公认的高性能网关,但如果不对其进行一些参数调优,就不能充分 ...
- [转帖]人脸特征计算速度优化-SIMD技术Neon介绍
人脸特征计算速度优化-SIMD技术Neon介绍 JasonZhu 游走于秃头和研究的边缘 关注 15 人赞同了该文章 目录 收起 1. baseline计算 2. simd和数据重排加速 数 ...
- 记一次JSF异步调用引起的接口可用率降低
前言 本文记录了由于JSF异步调用超时引起的接口可用率降低问题的排查过程,主要介绍了排查思路和JSF异步调用的流程,希望可以帮助大家了解JSF的异步调用原理以及提供一些问题排查思路.本文分析的JSF源 ...
- js分钟转化为小时并且以某个数字进行递增
有些时候,我们需要将分钟转为小时: 并且还有以一个数字进行递增: 呈现出[3,6,9,12,15,18]这样的递增形式 // 因为是递增,所以是相加: // 在使用+号的时候: // 注意两边都是数字 ...