资讯专栏INFORMATION COLUMN

Laravel 发送响应

PAMPANG / 2622人阅读

摘要:发送响应发送响应头发送响应体发送到客户端若是模式,则结束客户端响应后异步执行服务器端的后续任务,例如中间件的方法和事件等后续动作执行中间件的方法和事件等至此,框架核心流程全部走完

Laravel 发送响应
public function send()
{
    $this->sendHeaders();
    $this->sendContent();

    if (function_exists("fastcgi_finish_request")) {
        fastcgi_finish_request();
    } elseif ("cli" !== PHP_SAPI) {
        static::closeOutputBuffers(0, true);
    }

    return $this;
}
发送响应头
public function sendHeaders()
{
    if (headers_sent()) {
        return $this;
    }

    if (!$this->headers->has("Date")) {
        $this->setDate(DateTime::createFromFormat("U", time()));
    }

    foreach ($this->headers->allPreserveCase() as $name => $values) {
        foreach ($values as $value) {
            header($name.": ".$value, false, $this->statusCode);
        }
    }

    header(sprintf("HTTP/%s %s %s", $this->version, $this->statusCode, $this->statusText), true, $this->statusCode);

    foreach ($this->headers->getCookies() as $cookie) {
        if ($cookie->isRaw()) {
            setrawcookie($cookie->getName(), $cookie->getValue(), $cookie->getExpiresTime(), $cookie->getPath(), $cookie->getDomain(), $cookie->isSecure(), $cookie->isHttpOnly());
        } else {
            setcookie($cookie->getName(), $cookie->getValue(), $cookie->getExpiresTime(), $cookie->getPath(), $cookie->getDomain(), $cookie->isSecure(), $cookie->isHttpOnly());
        }
    }

    return $this;
}
发送响应体
public function sendContent()
{
    echo $this->content;

    return $this;
}
发送到客户端
// 若是 fastcgi 模式,则结束客户端响应后异步执行服务器端的后续任务,例如中间件的 terminate 方法和事件等
if (function_exists("fastcgi_finish_request")) {
    fastcgi_finish_request();
} elseif ("cli" !== PHP_SAPI) {
    static::closeOutputBuffers(0, true);
}
public static function closeOutputBuffers($targetLevel, $flush)
{
    $status = ob_get_status(true);
    $level = count($status);
    $flags = defined("PHP_OUTPUT_HANDLER_REMOVABLE") ? PHP_OUTPUT_HANDLER_REMOVABLE | ($flush ? PHP_OUTPUT_HANDLER_FLUSHABLE : PHP_OUTPUT_HANDLER_CLEANABLE) : -1;

    while ($level-- > $targetLevel && ($s = $status[$level]) && (!isset($s["del"]) ? !isset($s["flags"]) || $flags === ($s["flags"] & $flags) : $s["del"])) {
        if ($flush) {
            ob_end_flush();
        } else {
            ob_end_clean();
        }
    }
}
后续动作

执行中间件的 terminate 方法和事件等

至此,框架核心流程全部走完

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22612.html

相关文章

  • Laravel学习:请求到响应的生命周期

    摘要:请求处理阶段请求处理阶段首先是准备请求处理的环境,包括环境加载服务提供者注册等环节,然后将请求实例通过中间件处理及通过路由和控制器的分发控制,使得不同的请求通过相应的处理程序进行处理并生成响应的过程。 Laravel请求到响应的整个执行过程,主要可以归纳为四个阶段,即程序启动准备阶段、请求实例化阶段、请求处理阶段、响应发送和程序终止阶段。 程序启动准备阶段 服务容器实例化 服务容器的实...

    OBKoro1 评论0 收藏0
  • Laravel 开启跨域功能

    摘要:跨域的请求出于安全性的原因,浏览器会限制中的跨域请求。跨源共享标准需要浏览器和服务端共同配合才能完成,目前浏览器厂商已经可以将请求部分自动完成,所以跨源资源访问的重点还是在于服务器端。指明预请求或者跨域请求的来源。 跨域的请求 出于安全性的原因,浏览器会限制 Script 中的跨域请求。由于 XMLHttpRequest 遵循同源策略,所有使用 XMLHttpRequest 构造 HT...

    muzhuyu 评论0 收藏0
  • Laravel核心解读 -- Response

    摘要:设置生成对象后就要执行对象的方法了,该方法定义在类中,其主要目的是对进行微调使其能够遵从协议。最后会把完整的响应发送给客户端。本文已经收录在系列文章源码学习里,欢迎访问阅读。 Response 前面两节我们分别讲了Laravel的控制器和Request对象,在讲Request对象的那一节我们看了Request对象是如何被创建出来的以及它支持的方法都定义在哪里,讲控制器时我们详细地描述了...

    TigerChain 评论0 收藏0
  • Laravel最佳实践--事件驱动编程

    摘要:事件驱动编程是图形用户界面和其他应用程序例如应用程序中使用的主要范例,用于执行某些操作来响应用户输入。我们来看一下事件驱动编程带来的收益。现在让我们看看采用事件驱动编程方法如何实现上述相同的功能。 在这篇文章中我们将了解到什么是事件驱动编程以及在Laravel中如何开始构建一个事件驱动应用,同时我们还将看到如何通过事件驱动编程来对应用程序的逻辑进行解耦。 在开始之前,先说明一下这篇文章...

    Drummor 评论0 收藏0
  • 深度挖掘 Laravel 生命周期

    摘要:引导程序包括完成环境检测配置加载异常处理注册服务提供者注册启动服务这六个引导程序。处理请求请求处理发生在内核的方法内。发送响应头部信息发送报文主题终止程序程序终止,完成终止中间件的调用终止中间件以上便是的请求生命周期的始末。 本文首发于个人博客 深度挖掘 Laravel 生命周期,转载请注明出处。 这篇文章我们来聊聊 「Laravel 生命周期」 这个主题。虽然网络上已经有很多关于这个...

    arashicage 评论0 收藏0

发表评论

0条评论

PAMPANG

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<