Swoole v4.6 版本新特性之 Http\Response 增强

简介: 在 4.6 版本中,对 Swoole\Http\Response 进行了一些增强

在 4.6 版本中,对 Swoole\Http\Response 进行了一些增强:

  • 添加 Http\Response::isWritable (db56827) (@matyhtf)
  • 增强 Response\create() 方法,可以独立于 Server 使用 (#3998) (@matyhtf)

再来看一下上一篇文章的示例代码:

use Swoole\Server;
use Swoole\Http\Request;
$server = new Server('127.0.0.1', 9501);
$server->on('Receive', function (Server $server, $fd, $reactor_id, $data) {
    /** @var Request $request */
    $request = Request::create();
    $request->parse($data);
    $body = 'Hello, Swoole';
    $body_len = strlen($body);
    $send_data = "HTTP/1.1 200 OK\r\nServer: swoole-server\r\nContent-Type: text/html;charset=utf-8\r\nContent-Length: {$body_len}\r\nConnection: keep-alive\r\n\r\n{$body}";
    $server->send($fd, $send_data);
});
$server->start();

需要用户自行处理$send_data的数据,而此次增强以后,可以这样使用:

use Swoole\Server;
use Swoole\Http\Request;
use Swoole\Http\Response;
$server = new Server('127.0.0.1', 9501);
$server->on('Receive', function (Server $server, $fd, $reactor_id, $data) {
    /** @var Request $request */
    $request = Request::create();
    $request->parse($data);
    /** @var Response $response */
    $response = Response::create($server, $fd);
    $response->status(200);
    $response->end('Hello, Swoole');
});
$server->start();

还可以这样:

$server->on('Receive', function (Server $server, $fd, $reactor_id, $data) {
    /** @var Request $request */
    $request = Request::create();
    $request->parse($data);
    /** @var Response $response */
    $response = Response::create([$server, $request], $fd);
    $response->status(200);
    $response->end('Hello, Swoole');
});

不但异步 Server 中可以使用,而且协程 Server 中也可以使用:

use Swoole\Coroutine\Server;
use Swoole\Coroutine\Server\Connection;
use Swoole\Http\Request;
use Swoole\Http\Response;
use function Swoole\Coroutine\run;
run(function () {
    $server = new Server('0.0.0.0', 9501, false);
    $server->handle(function (Connection $conn) use ($server) {
        $request = Request::create();
        while(true) {
            $data = $conn->recv();
            if (strlen($data) != $request->parse($data) || $request->isCompleted()) {
                break;
            }
        }
        $response = Response::create([$conn->exportSocket(), $request]);
        $response->end('Hello, Swoole');
    });
    $server->start();
});

这样就可以直接使用 Http\Response 的 API 进行响应处理,而不用自行组装 HTTP 协议响应数据。


isWritable


isWritable() 用来判断 Http\Response 对象是否已结束 (end) 或已分离 (detach),例如:

use Swoole\Http\Server;
use Swoole\Http\Request;
use Swoole\Http\Response;
$http = new Server('0.0.0.0', 9501);
$http->on('request', function (Request $req, Response $resp) {
    assert($resp->isWritable(), true);
    $resp->end('hello');
    assert($resp->isWritable(), false);
    $resp->setStatusCode(403);
});
$http->start();

如果在调用end()之后,再次调用相关 API,就会发生错误

PHP Warning:  Swoole\Http\Response::setStatusCode(): http response is unavailable (maybe it has been ended or detached)
目录
相关文章
|
2月前
|
Dubbo 安全 应用服务中间件
Apache Dubbo 正式发布 HTTP/3 版本 RPC 协议,弱网效率提升 6 倍
在 Apache Dubbo 3.3.0 版本之后,官方推出了全新升级的 Triple X 协议,全面支持 HTTP/1、HTTP/2 和 HTTP/3 协议。本文将围绕 Triple 协议对 HTTP/3 的支持进行详细阐述,包括其设计目标、实际应用案例、性能测试结果以及源码架构分析等内容。
|
5月前
|
Web App开发 缓存 网络协议
HTTP3版本和实现验证
这篇文章详细介绍了HTTP3协议及其与HTTP2的比较,解释了HTTP3基于QUIC协议的工作原理,包括0-RTT恢复、H3-29草案等技术细节,并提供了验证网站HTTP3支持和浏览器支持的工具和方法。
102 1
|
5月前
|
JavaScript 前端开发 Java
【Azure 环境】各种语言版本或命令,发送HTTP/HTTPS的请求合集
【Azure 环境】各种语言版本或命令,发送HTTP/HTTPS的请求合集
|
5月前
|
Oracle Java 关系型数据库
JDK版本特性问题之在 JDK 11 中,HTTP Client API 的特点有哪些
JDK版本特性问题之在 JDK 11 中,HTTP Client API 的特点有哪些
|
6月前
|
网络协议 程序员 应用服务中间件
Swoole与Go系列教程之HTTP服务的应用
PHP 曾是Web开发领域佼佼者,随着业务壮大,异步和高并发方面不足显现。Swoole 曾经尝试填补空白,但局限性也比较的明显。Go 语言的崛起,简洁语法和并发优势吸引大厂使用,吸引了大多数程序员的转型。
1010 0
Swoole与Go系列教程之HTTP服务的应用
|
7月前
|
域名解析 存储 缓存
HTTP请求流程概览:浏览器构建请求行含方法、URL和版本;检查缓存;解析IP与端口
【6月更文挑战第23天】 HTTP请求流程概览:浏览器构建请求行含方法、URL和版本;检查缓存;解析IP与端口;TCP连接(HTTP/1.1可能需排队);三次握手;发送请求头与体;服务器处理并返回响应;TCP连接可能关闭或保持;浏览器接收并显示响应,更新缓存。HTTP版本间有差异。
116 5
|
7月前
|
网络协议 PHP
Swoole 源码分析之 Http Server 模块
想要了解到 `Http Server` 的全貌,其实只要把那张整体的实现图看懂就足以了。但是,如果想要有足够的深度,那么就还需要深入 `Swoole` 的源代码中,就着源码自行分析一遍。同时,也希望这一次的分析,能够给大家带来对 `Swoole` 更多的一些了解。并不要求要深刻的掌握,因为,很多的事情都不可能一蹴而就。从自己的实力出发,勿忘初心。
91 0
Swoole 源码分析之 Http Server 模块
|
7月前
|
应用服务中间件 网络安全 nginx
docker 搭建 最新版本的 gitlab,使用HTTPS访问,以及gitlab的基础使用讲解
docker 搭建 最新版本的 gitlab,使用HTTPS访问,以及gitlab的基础使用讲解
|
8月前
|
XML JSON JavaScript
推荐一个比较好用的c++版本http协议库-cpp-httplib
推荐一个比较好用的c++版本http协议库-cpp-httplib
344 1
|
4月前
|
监控 安全 搜索推荐
设置 HTTPS 协议以确保数据传输的安全性
设置 HTTPS 协议以确保数据传输的安全性