摘要:問題分析通過閱讀源碼發現,中的服務都是按需綁定并加載。在服務按需綁定并加載的時候,使用了類似組件的形式通過載入配置項并綁定服務。因為在這個時候的相關配置文件還沒有被載入。
問題描述
公司一個高并發API需要從Laravel移植到Lumen,由于數據庫配置信息是通過遠程或者緩存讀取后動態配置,所以在中間件時使用到了 Config::set 然而實際運行時發現數據庫配置并沒有更新。
由于是從Laravel移植,因此保留了Facades的寫法,Lumen中可以通過以下方法使用Facades:
取消 bootstarp/app.php 中 $app->withFacades(); 的注釋
use IlluminateSupportFacadesXXX
另一方面,系統使用 Redis 作為緩存,通過 env 配置 Redis ,配置信息存儲在 config/database.php 在沒有使用數據庫先使用緩存的情況下,報沒有傳配置項的錯誤。
問題分析通過閱讀源碼 laravel/lumen-framework/src/Application.php 發現,Lumen中的服務都是按需綁定并加載。先來看看 make() 的代碼:
public function make($abstract, array $parameters = []) { $abstract = $this->getAlias($this->normalize($abstract)); if (array_key_exists($abstract, $this->availableBindings) && ! array_key_exists($this->availableBindings[$abstract], $this->ranServiceBinders)) { $this->{$method = $this->availableBindings[$abstract]}(); $this->ranServiceBinders[$method] = true; } return parent::make($abstract, $parameters); }
Lumen通過數組 $availableBindings 實現了基本服務的按需綁定并加載。在服務按需綁定并加載的時候,使用了類似組件的形式通過 loadComponent() 載入配置項并綁定服務。再來看看 loadComponent() 的代碼:
public function loadComponent($config, $providers, $return = null) { $this->configure($config); foreach ((array) $providers as $provider) { $this->register($provider); } return $this->make($return ?: $config); }
如此就釋然為什么在中間件以及使用 DB 之前想要動態配置數據庫的信息時無法正確的寫入配置項了。因為在這個時候 DB 的相關配置文件還沒有被載入。你先寫入了配置項當使用 DB 的時候會再次載入配置文件中的配置項覆蓋動態寫入的內容。
同理,使用 Redis 時,由于 Redis 相關配置是寫在 database.php 里的,僅僅通過 $app->register(IlluminateRedisRedisServiceProvider::class); 注冊是無法獲取到配置項,如果在使用 Redis 時之前沒有使用 DB 就會報沒有傳配置項的錯誤。
解決方案既然找到了問題所在,要解決起來也是很方便的。只要在修改、使用配置項之前先載入配置文件就可以解決這些問題。比如:
使用 app()->configure("database"); 載入所需要的配置文件
在注冊綁定服務到服務容器的時候使用 loadComponent 進行注冊綁定
歡迎關注我的博客 http://targetliu.com
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21790.html
摘要:的按需加載設置安裝插件修改或新建文件進行編輯,但兩者只能存一種根據配置更改主題顏色在中找到原配置注釋后更改為定義全局樣式配置自定義主題只需修改的顏色,再重啟項目即可更改主題顏色 為了在react中使用antd以及它的主題更改,需要在項目中 yarn eject 暴露出webpack文件進行改造本答案是在日期當時最新的create-react-app上的webpack版本 less-l...
摘要:之前在內使用的隊列服務做了一個異步,處理一些內容審核的相關操作。但是每次重啟容器之后都需要進入內部啟動的隊列進程雖然文檔內有寫使用管理進程,但是并沒有那么做。。,最近需求上需要使用,所以決定使用來管理這些進程。所以使用了一個腳本,在執行它。 之前在docker內使用lumen的隊列服務做了一個異步,處理一些內容審核的相關操作。但是每次重啟容器之后都需要進入docker內部啟動lumen...
摘要:之前在內使用的隊列服務做了一個異步,處理一些內容審核的相關操作。但是每次重啟容器之后都需要進入內部啟動的隊列進程雖然文檔內有寫使用管理進程,但是并沒有那么做。。,最近需求上需要使用,所以決定使用來管理這些進程。所以使用了一個腳本,在執行它。 之前在docker內使用lumen的隊列服務做了一個異步,處理一些內容審核的相關操作。但是每次重啟容器之后都需要進入docker內部啟動lumen...
摘要:現在的提供了一種更易于使用和維護的計劃任務方式。注意事項建議開啟這樣會極大的加速類的加載。 lumen 為速度而生的 Laravel 框架 官網的介紹很簡潔,而且 lumen 確實也很簡單,我在調研了 lumen 相關組件(比如緩存,隊列,校驗,路由,中間件和最重要的容器)之后認為已經能夠滿足我目前這個微服務的需求了。 任務目標 showImg(https://segmentfault...
摘要:另外,與模板方法將分別在測試用例類的第一個測試運行之前和測試用例類的最后一個測試運行之后調用。 本系列教程所有的PHPUnit測試基于PHPUnit6.5.9版本,Lumen 5.5框架 PHPUnit測試一個文件類的生命周期 showImg(https://segmentfault.com/img/bVbnXJj?w=1330&h=1186); 理解PHPUnit加載機制(Lumen...
閱讀 782·2023-04-25 17:33
閱讀 3632·2021-07-29 14:49
閱讀 2485·2019-08-30 15:53
閱讀 3439·2019-08-29 16:27
閱讀 2004·2019-08-29 16:11
閱讀 1035·2019-08-29 14:17
閱讀 2439·2019-08-29 13:47
閱讀 2022·2019-08-29 13:28