# 上下文
我們在講進程、線程的時候多次提及了上下文切換,上下文其實在我們生活中也經常遇到,可能只是我們沒有細心留意。
### 什么是上下文?
上小學考試的時候,經常我們試卷上會有一段文章的句子,讓我們解釋出那句話的前因后果;我們也學過承上啟下,上下文跟這個差不多,根據文章前面的內容和后面的內容得知這句話的意思。不然給你一段話,你根本不知道這段話出現在文章的這個地方表示什么。
例如:我和她假期去旅游。
這句話我們可以引出三個問題。她是指的誰?假期是哪個假期?去哪里旅游?貿然的給我們一句話我們不知道這段話說的意思。因為這段話沒有上文也沒有下文,我們不知道說的`她`是誰;還有這個`假期`是過去式還是將來時;如果這句話改一改,把上下文帶進來。
下面是小明和小強的對白:
小明:小強不好意思啊。我假期沒空和你一起加班了。
小強:為什么啊?
小明:我和她假期去旅游。
小強:和誰去哪呢?
小明:小紅啊,她說五一有空,我和她一起出去三亞下海。
小強:滾吧,重色輕友的混蛋。
這樣就有了上下文,我們就知道這個`她`是誰,`假期`是什么時候,`目的地`是哪里。這就是語文里面理解的上下文的左右。
上下文沒有具體的解釋,也沒有某一個具體的實例來解釋,上下文會根據應用程序的生命周期而變化。也就是說同樣的一句話在不同的上下文環境中,所表示的意思不一樣。
### 為什么使用上下文?
我們理解了什么是上下文,那么我們說說編程里面的上下文,說白了編程里面的上下文就是一個環境。跟前面了解的情況一下,沒有上下文我們不知道某一個變量處于某一個時刻或者某一進程,線程代表什么意思。因此上下文就是告訴這些變量所處的位置,例如一個進程切換的時候需要保存進程的狀態,資源保護好現場,等到再次切換回來的時候從中斷的地方恢復。

<center>圖:3.1-1</center>
如圖:3.1-1所示,我們在每一個請求都有變量、數據庫資源、文件資源等等。在不同的上下文環境中,這些請求的值所表示不一樣的內容。例如在請求1中userid是1002,在請求2中userid是999。
在使用常駐內存框架的時候很多時候為了性能,控制器會弄成單例的,所以我們在使用的時候不能像以往在fpm模式下開發一樣,使用基類來繼承屬性在控制器使用共同屬性;例如我們在中間件做授權驗證,如果想要把這個用戶id繼續傳到控制器使用,怎么辦呢?我們又不能通過基類的方式來繼承,這時候可以把這個id掛載到上下文中。
### 為什么在php-fpm不需要上下文?
其實在php-fpm模式開發我們經常不需要管理上下文,因為在php-fpm模式開發不是常駐內存的,并且php-fpm幫我們管理了上下文,不需要開發者自己管理,而在常駐內存開發中需要維護每個請求的環境。
- 第一章:基礎知識
- 課程簡介
- PHP-FPM過渡常駐內存
- 進程
- 實戰:實現Master-Worker
- 線程
- 實戰:CC攻擊器
- 協程
- 實戰:實現waitGroup功能
- 進程、線程、協程的區別
- 第二章:初識Swoft2.0
- Swoft介紹
- Swoft環境安裝
- gcc升級
- 安裝Swoft框架
- 目錄結構介紹
- SwoftCli工具
- Swoft配置
- 第三章:Swoft2.0核心
- 上下文
- 常駐內存沒有上下文隔離
- 實戰:手寫swoole框架上下文管理
- Bean容器
- 實戰:根據容器原理實現容器
- 實戰:通過容器實現依賴注入
- Bean容器定義與使用
- 配置文件定義Bean
- 容器類型
- 面向接口的容器
- 注解
- 實戰:實現注解
- 自定義Swoft注解類
- 事件
- 連接池
- 實戰:Swoole實現連接池
- 第四章:Http服務器
- Http Server生命周期
- Http Server配置
- 控制器
- 路由
- 請求對象Request
- 響應對象Response
- Http異常處理
- 中間件
- 實戰:中間件實現JWT登陸授權
- 第五章:驗證器
- 內置驗證類型
- 驗證器的使用
- 自定義驗證器
- 第六章:數據庫操作
- 連接數據庫
- 實體模型
- 模型事件
- 查詢器
- 事務處理
- 連接池配置
- 讀寫分離
- 多數據庫切換
- Models分層結構
- 實戰:實現用戶CURD API
- 第七章:Redis
- 連接redis和使用
- Redis連接池
- Redis集群配置(單機版)
- Redis集群配置(多服務器)
- Redis連接集群
- Redis實戰:實現延時任務
- 第八章:AOP編程
- AOP概念
- AOP實現原理
- 實戰實現AOP:靜態代理
- 實戰實現AOP:動態代理
- 切面注解介紹
- PointExecution切面
- PointBean切面
- PointAnnotation切面
- 實戰:使用AOP實現日志記錄
- 第九章:任務處理
- 進程使用
- 進程池使用
- 實戰:進程消費隊列
- 實戰:進程實現RabbitMQ延時隊列
- 異步任務
- 協程任務
- 定時任務