摘要:由于是基于容器創建和銷毀資源的,那么各個容器之間是相對隔離的。也就是說每次請求都會創建一個新的環境用于執行和解析,由于容器的隔離性,每個請求都不會和其他請求進行干擾。因為只有當前協程才可以讀取到該數據。
前言
ThinkPHP即將迎來最新版本6.0,針對目前越來越流行Swoole,thinkphp也推出了最新的擴展think-swoole 3.0沙盒
本文主要介紹在ThinkPHP-swoole 3.0當中所用到的沙盒技術。
沙盒--顧名思義,所有程序都運行在一個封閉容器當中,得益于更完善的容器技術,在3.0擴展當中沙盒得以大展身手。
首先,查看沙盒是如何使用的,查看擴展當中Swoole.php,其中的OnRequest函數
public function onRequest($req, $res) { $this->app->event->trigger("swoole.request"); $this->resetOnRequest(); /** @var Sandbox $sandbox */ $sandbox = $this->app->make(Sandbox::class); $request = $this->prepareRequest($req); try { $sandbox->setRequest($request); $sandbox->init(); $response = $sandbox->run($request); $this->sendResponse($sandbox, $response, $res); } catch (Throwable $e) { try { $exceptionResponse = $this->app ->make(Handle::class) ->render($request, $e); $this->sendResponse($sandbox, $exceptionResponse, $res); } catch (Throwable $e) { $this->logServerError($e); } } finally { $sandbox->clear(); } }
代碼中,從容器中取出沙盒,然后將請求注入到沙盒,并在沙盒中計算并返回結果。最終對沙盒進行清除,那么Sandbox是如何起到沙盒的作用的呢?
//$sandbox->setRequest($request); public function setRequest(Request $request) { Context::setData("_request", $request); return $this; }
上述代碼將請求注入到了沙盒內,這里又多出一個Context,那么這個類又是做什么的呢?為何不在沙盒內整個屬性來存儲呢?這個我們文末在做介紹,我介紹沙盒。
//$sandbox->init(); public function init() { if (!$this->config instanceof Config) { throw new RuntimeException("Please initialize after setting base app."); } $this->setInstance($app = $this->getApplication()); $this->resetApp($app); }
最主要的環節也就是這里了,看到這里就明白沙盒為何稱之為沙盒了。由于tp6是基于容器創建和銷毀資源的,那么各個容器之間是相對隔離的。下面接著看代碼
//$this->setInstance($app = $this->getApplication()); public function getApplication() { $snapshot = $this->getSnapshot(); if ($snapshot instanceof Container) { return $snapshot; } $snapshot = clone $this->getBaseApp(); $this->setSnapshot($snapshot); return $snapshot; }
看到什么了嗎?clone,復制。這里將容器對象進行了復制,也就是原容器有的對象,這個新容器也有。也就是說每次請求都會創建一個新的環境用于執行和解析,由于容器的隔離性,每個請求都不會和其他請求進行干擾。
至于下面這段代碼,看到這里,我覺得您也已經明白了。
$this->resetApp($app);
最后,$sandbox->clear(),清空Context類中保存的當前協程的數據,并將當前沙盒的容器初始化
public function clear() { Context::clear(); $this->setInstance($this->getBaseApp()); }番外篇
沙盒當中為何會需要Context類呢?看到這個類以后就會明白了,static::getCoroutineId()是獲取當前的協程ID,每一個協程都會有一個獨一無二的ID,這樣通過Context來存一些特殊數據或者對象就不會造成數據混亂。因為只有當前協程才可以讀取到該數據。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/31735.html
摘要:如下圖目錄結構主要針對的是非常駐內存方式運行,為了兼容,雖然做了很多優化,但是仍然無法像,等一些針對開發的框架一樣。在非常住內存框架中,為了方便會有一些寫法導致在常駐內存方式下不容易被釋放內存,小則內存泄漏,大則數據錯亂。 前言 ThinkPHP即將迎來最新版本6.0,針對目前越來越流行Swoole,thinkphp也推出了最新的擴展think-swoole 3.0 架構分析 tp-s...
摘要:前言即將迎來最新版本,針對目前越來越流行,也推出了最新的擴展安裝由于目前沒有穩定版本,所以只能安裝開發板接下來安裝,目前最新的穩定版本是配置安裝結束可以根據自己的需求對配置信息進行修改。 前言 ThinkPHP即將迎來最新版本6.0,針對目前越來越流行Swoole,thinkphp也推出了最新的擴展think-swoole 3.0 安裝 由于目前thinkphp 6.0沒有穩定版本,所...
摘要:前言即將迎來最新版本,針對目前越來越流行,也推出了最新的擴展。介紹即將推出的,已經適配并推出,并且默認適配了。和版本在使用方法上面有些許不同。其中的第一個參數和的第一個參數一致,作為事件名稱。 前言 ThinkPHP即將迎來最新版本6.0,針對目前越來越流行Swoole,thinkphp也推出了最新的擴展think-swoole 3.0。 介紹 即將推出的tp6.0,已經適配swool...
摘要:安裝框架安裝如果已經安裝了可以跳過本步驟,但是請確定通過命令來確保已經使用了最新版本的使用以下命令可以直接通過官網下載并自動安裝到目錄下如果以上安裝過程極慢的話,可以嘗試用以下方式通過國內鏡像來安裝。 《當 Swoole 遇上 ThinkPHP5》:Hello,World! 本文假設你已經有了 Linux 操作系統的 PHP 環境,強烈推薦使用 Vagrant 來搭建開發環境 安裝 ...
摘要:文章目錄一線性模型二繪圖工具三作業一線性模型不要小看簡單線性模型哈哈,雖然這講我們還沒正式用到,但是用到的前向傳播損失函數兩種繪圖等方法在后面是很常用的。 文章目...
閱讀 987·2021-11-24 10:30
閱讀 2316·2021-10-08 10:04
閱讀 3949·2021-09-30 09:47
閱讀 1433·2021-09-29 09:45
閱讀 1435·2021-09-24 10:33
閱讀 6234·2021-09-22 15:57
閱讀 2351·2021-09-22 15:50
閱讀 4079·2021-08-30 09:45