摘要:發(fā)送響應發(fā)送響應頭發(fā)送響應體發(fā)送到客戶端若是模式,則結束客戶端響應后異步執(zhí)行服務器端的后續(xù)任務,例如中間件的方法和事件等后續(xù)動作執(zhí)行中間件的方法和事件等至此,框架核心流程全部走完
Laravel 發(fā)送響應
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; }發(fā)送響應頭
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; }發(fā)送響應體
public function sendContent() { echo $this->content; return $this; }發(fā)送到客戶端
// 若是 fastcgi 模式,則結束客戶端響應后異步執(zhí)行服務器端的后續(xù)任務,例如中間件的 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(); } } }后續(xù)動作
執(zhí)行中間件的 terminate 方法和事件等
至此,框架核心流程全部走完
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/22612.html
摘要:請求處理階段請求處理階段首先是準備請求處理的環(huán)境,包括環(huán)境加載服務提供者注冊等環(huán)節(jié),然后將請求實例通過中間件處理及通過路由和控制器的分發(fā)控制,使得不同的請求通過相應的處理程序進行處理并生成響應的過程。 Laravel請求到響應的整個執(zhí)行過程,主要可以歸納為四個階段,即程序啟動準備階段、請求實例化階段、請求處理階段、響應發(fā)送和程序終止階段。 程序啟動準備階段 服務容器實例化 服務容器的實...
摘要:跨域的請求出于安全性的原因,瀏覽器會限制中的跨域請求??缭垂蚕順藴市枰獮g覽器和服務端共同配合才能完成,目前瀏覽器廠商已經(jīng)可以將請求部分自動完成,所以跨源資源訪問的重點還是在于服務器端。指明預請求或者跨域請求的來源。 跨域的請求 出于安全性的原因,瀏覽器會限制 Script 中的跨域請求。由于 XMLHttpRequest 遵循同源策略,所有使用 XMLHttpRequest 構造 HT...
摘要:設置生成對象后就要執(zhí)行對象的方法了,該方法定義在類中,其主要目的是對進行微調(diào)使其能夠遵從協(xié)議。最后會把完整的響應發(fā)送給客戶端。本文已經(jīng)收錄在系列文章源碼學習里,歡迎訪問閱讀。 Response 前面兩節(jié)我們分別講了Laravel的控制器和Request對象,在講Request對象的那一節(jié)我們看了Request對象是如何被創(chuàng)建出來的以及它支持的方法都定義在哪里,講控制器時我們詳細地描述了...
摘要:事件驅(qū)動編程是圖形用戶界面和其他應用程序例如應用程序中使用的主要范例,用于執(zhí)行某些操作來響應用戶輸入。我們來看一下事件驅(qū)動編程帶來的收益?,F(xiàn)在讓我們看看采用事件驅(qū)動編程方法如何實現(xiàn)上述相同的功能。 在這篇文章中我們將了解到什么是事件驅(qū)動編程以及在Laravel中如何開始構建一個事件驅(qū)動應用,同時我們還將看到如何通過事件驅(qū)動編程來對應用程序的邏輯進行解耦。 在開始之前,先說明一下這篇文章...
摘要:引導程序包括完成環(huán)境檢測配置加載異常處理注冊服務提供者注冊啟動服務這六個引導程序。處理請求請求處理發(fā)生在內(nèi)核的方法內(nèi)。發(fā)送響應頭部信息發(fā)送報文主題終止程序程序終止,完成終止中間件的調(diào)用終止中間件以上便是的請求生命周期的始末。 本文首發(fā)于個人博客 深度挖掘 Laravel 生命周期,轉(zhuǎn)載請注明出處。 這篇文章我們來聊聊 「Laravel 生命周期」 這個主題。雖然網(wǎng)絡上已經(jīng)有很多關于這個...
閱讀 2394·2019-08-30 15:56
閱讀 1052·2019-08-30 15:55
閱讀 3214·2019-08-30 15:44
閱讀 942·2019-08-30 10:53
閱讀 1897·2019-08-29 16:33
閱讀 2501·2019-08-29 16:13
閱讀 728·2019-08-29 12:41
閱讀 885·2019-08-26 13:56