成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Lumen配置文件按需加載出現(xiàn)的坑

lentoo / 1782人閱讀

摘要:?jiǎn)栴}分析通過(guò)閱讀源碼發(fā)現(xiàn),中的服務(wù)都是按需綁定并加載。在服務(wù)按需綁定并加載的時(shí)候,使用了類似組件的形式通過(guò)載入配置項(xiàng)并綁定服務(wù)。因?yàn)樵谶@個(gè)時(shí)候的相關(guān)配置文件還沒(méi)有被載入。

問(wèn)題描述

公司一個(gè)高并發(fā)API需要從Laravel移植到Lumen,由于數(shù)據(jù)庫(kù)配置信息是通過(guò)遠(yuǎn)程或者緩存讀取后動(dòng)態(tài)配置,所以在中間件時(shí)使用到了 Config::set 然而實(shí)際運(yùn)行時(shí)發(fā)現(xiàn)數(shù)據(jù)庫(kù)配置并沒(méi)有更新。

由于是從Laravel移植,因此保留了Facades的寫(xiě)法,Lumen中可以通過(guò)以下方法使用Facades:

取消 bootstarp/app.php$app->withFacades(); 的注釋

use IlluminateSupportFacadesXXX

另一方面,系統(tǒng)使用 Redis 作為緩存,通過(guò) env 配置 Redis ,配置信息存儲(chǔ)在 config/database.php 在沒(méi)有使用數(shù)據(jù)庫(kù)先使用緩存的情況下,報(bào)沒(méi)有傳配置項(xiàng)的錯(cuò)誤。

問(wèn)題分析

通過(guò)閱讀源碼 laravel/lumen-framework/src/Application.php 發(fā)現(xiàn),Lumen中的服務(wù)都是按需綁定并加載。先來(lái)看看 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通過(guò)數(shù)組 $availableBindings 實(shí)現(xiàn)了基本服務(wù)的按需綁定并加載。在服務(wù)按需綁定并加載的時(shí)候,使用了類似組件的形式通過(guò) loadComponent() 載入配置項(xiàng)并綁定服務(wù)。再來(lái)看看 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 之前想要?jiǎng)討B(tài)配置數(shù)據(jù)庫(kù)的信息時(shí)無(wú)法正確的寫(xiě)入配置項(xiàng)了。因?yàn)樵谶@個(gè)時(shí)候 DB 的相關(guān)配置文件還沒(méi)有被載入。你先寫(xiě)入了配置項(xiàng)當(dāng)使用 DB 的時(shí)候會(huì)再次載入配置文件中的配置項(xiàng)覆蓋動(dòng)態(tài)寫(xiě)入的內(nèi)容。

同理,使用 Redis 時(shí),由于 Redis 相關(guān)配置是寫(xiě)在 database.php 里的,僅僅通過(guò) $app->register(IlluminateRedisRedisServiceProvider::class); 注冊(cè)是無(wú)法獲取到配置項(xiàng),如果在使用 Redis 時(shí)之前沒(méi)有使用 DB 就會(huì)報(bào)沒(méi)有傳配置項(xiàng)的錯(cuò)誤。

解決方案

既然找到了問(wèn)題所在,要解決起來(lái)也是很方便的。只要在修改、使用配置項(xiàng)之前先載入配置文件就可以解決這些問(wèn)題。比如:

使用 app()->configure("database"); 載入所需要的配置文件

在注冊(cè)綁定服務(wù)到服務(wù)容器的時(shí)候使用 loadComponent 進(jìn)行注冊(cè)綁定


歡迎關(guān)注我的博客 http://targetliu.com

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/21790.html

相關(guān)文章

  • 使用less-loader與antd按需加載(babel-plugin-import)的坑

    摘要:的按需加載設(shè)置安裝插件修改或新建文件進(jìn)行編輯,但兩者只能存一種根據(jù)配置更改主題顏色在中找到原配置注釋后更改為定義全局樣式配置自定義主題只需修改的顏色,再重啟項(xiàng)目即可更改主題顏色 為了在react中使用antd以及它的主題更改,需要在項(xiàng)目中 yarn eject 暴露出webpack文件進(jìn)行改造本答案是在日期當(dāng)時(shí)最新的create-react-app上的webpack版本 less-l...

    Eminjannn 評(píng)論0 收藏0
  • Docker 使用 supervisord 管理 lumen隊(duì)列與crontab

    摘要:之前在內(nèi)使用的隊(duì)列服務(wù)做了一個(gè)異步,處理一些內(nèi)容審核的相關(guān)操作。但是每次重啟容器之后都需要進(jìn)入內(nèi)部啟動(dòng)的隊(duì)列進(jìn)程雖然文檔內(nèi)有寫(xiě)使用管理進(jìn)程,但是并沒(méi)有那么做。。,最近需求上需要使用,所以決定使用來(lái)管理這些進(jìn)程。所以使用了一個(gè)腳本,在執(zhí)行它。 之前在docker內(nèi)使用lumen的隊(duì)列服務(wù)做了一個(gè)異步,處理一些內(nèi)容審核的相關(guān)操作。但是每次重啟容器之后都需要進(jìn)入docker內(nèi)部啟動(dòng)lumen...

    cyqian 評(píng)論0 收藏0
  • Docker 使用 supervisord 管理 lumen隊(duì)列與crontab

    摘要:之前在內(nèi)使用的隊(duì)列服務(wù)做了一個(gè)異步,處理一些內(nèi)容審核的相關(guān)操作。但是每次重啟容器之后都需要進(jìn)入內(nèi)部啟動(dòng)的隊(duì)列進(jìn)程雖然文檔內(nèi)有寫(xiě)使用管理進(jìn)程,但是并沒(méi)有那么做。。,最近需求上需要使用,所以決定使用來(lái)管理這些進(jìn)程。所以使用了一個(gè)腳本,在執(zhí)行它。 之前在docker內(nèi)使用lumen的隊(duì)列服務(wù)做了一個(gè)異步,處理一些內(nèi)容審核的相關(guān)操作。但是每次重啟容器之后都需要進(jìn)入docker內(nèi)部啟動(dòng)lumen...

    hlcc 評(píng)論0 收藏0
  • 基于 lumen 的微服務(wù)架構(gòu)實(shí)踐

    摘要:現(xiàn)在的提供了一種更易于使用和維護(hù)的計(jì)劃任務(wù)方式。注意事項(xiàng)建議開(kāi)啟這樣會(huì)極大的加速類的加載。 lumen 為速度而生的 Laravel 框架 官網(wǎng)的介紹很簡(jiǎn)潔,而且 lumen 確實(shí)也很簡(jiǎn)單,我在調(diào)研了 lumen 相關(guān)組件(比如緩存,隊(duì)列,校驗(yàn),路由,中間件和最重要的容器)之后認(rèn)為已經(jīng)能夠滿足我目前這個(gè)微服務(wù)的需求了。 任務(wù)目標(biāo) showImg(https://segmentfault...

    hatlonely 評(píng)論0 收藏0
  • PHPUnit實(shí)踐二(生命周期)

    摘要:另外,與模板方法將分別在測(cè)試用例類的第一個(gè)測(cè)試運(yùn)行之前和測(cè)試用例類的最后一個(gè)測(cè)試運(yùn)行之后調(diào)用。 本系列教程所有的PHPUnit測(cè)試基于PHPUnit6.5.9版本,Lumen 5.5框架 PHPUnit測(cè)試一個(gè)文件類的生命周期 showImg(https://segmentfault.com/img/bVbnXJj?w=1330&h=1186); 理解PHPUnit加載機(jī)制(Lumen...

    jemygraw 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<