• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Swoole-v46-版本新特性之-Http\Response-增强

php 搞代码 3年前 (2022-02-28) 22次浏览 已收录 0个评论
文章目录[隐藏]

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

  • 增加 Http\Response::isWritable (db56827) (@matyhtf)
  • 加强 Response\create() 办法,能够独立于 Server 应用 (#3998) (@matyhtf)

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

<code class="php">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的数据,而此次加强当前,能够这样应用:

<code class="php">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();

还能够这样:

<code class="php">$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 中也能够应用:

<code class="php">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),例如:

<code class="php">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,就会产生谬误

<code class="bash">PHP Warning:  Swoole\Http\Response::setStatusCode(): http response is unavailable (maybe it has been ended or detached)

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Swoole-v46-版本新特性之-Http\Response-增强

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址