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

資訊專欄INFORMATION COLUMN

一次 Laravel 性能分析全程筆記

Cruise_Chan / 2929人閱讀

摘要:大家都知道項目寫起來是挺爽,但是在生產(chǎn)環(huán)境性能不高,我們來抽絲剝繭分析我自己項目的運行時間消耗耗時步驟耗時觀察初步結論在調(diào)用和的方法時,消耗時間是大頭。類是用于注冊服務提供者的。但此優(yōu)化在下無效。我們進一步分析。

大家都知道 laravel 項目寫起來是挺爽,但是在生產(chǎn)環(huán)境性能不高,我們來抽絲剝繭分析我自己項目的運行時間消耗:

Bootstrap 耗時
步驟 耗時
IlluminateFoundationBootstrapLoadEnvironmentVariables 0.3058910369873
IlluminateFoundationBootstrapLoadConfiguration 3.6571025848389
IlluminateFoundationBootstrapHandleExceptions 0.78296661376953
IlluminateFoundationBootstrapRegisterFacades 9.0579986572266
IlluminateFoundationBootstrapRegisterProviders 101.02701187134
IlluminateFoundationBootstrapBootProviders 96.982002258301

觀察初步結論: laravel 在調(diào)用 IlluminateFoundationBootstrapRegisterProvidersIlluminateFoundationBootstrapBootProvidersbootstrap 方法時,消耗時間是大頭。

IlluminateFoundationBootstrapRegisterProviders 是用于注冊服務提供者的。

IlluminateFoundationBootstrapBootProviders 是用于啟動服務提供者的。

laravel 的內(nèi)置server php artisan serve 自帶了優(yōu)化機制,上面數(shù)據(jù)僅體現(xiàn)首次加載的耗時。二次加載時會相比少很多。但此優(yōu)化在 fpm 下無效。

我們進一步分析。


RegisterProviders 耗時

IlluminateFoundationBootstrapRegisterProviders::bootstrap 方法代碼如下:

    /**
     * Bootstrap the given application.
     *
     * @param  IlluminateFoundationApplication  $app
     * @return void
     */
    public function bootstrap(Application $app)
    {
        $app->registerConfiguredProviders();
    }

所以我們還是回到了 IlluminateFoundationApplication 這個文件:

    /**
     * Register all of the configured providers.
     *
     * @return void
     */
    public function registerConfiguredProviders()
    {
        $providers = Collection::make($this->config["app.providers"])
                        ->partition(function ($provider) {
                            return Str::startsWith($provider, "Illuminate");
                        });

        $providers->splice(1, 0, [$this->make(PackageManifest::class)->providers()]);

        (new ProviderRepository($this, new Filesystem, $this->getCachedServicesPath()))
                    ->load($providers->collapse()->toArray());
    }

針對上面的 (new ProviderRepository)->load 進行耗時分析發(fā)現(xiàn)數(shù)據(jù)為

步驟 耗時
IlluminateFoundationProviderRepository::load 61.771869659424

毋庸置疑這就是消耗時間的大頭。

里面的代碼為

    /**
     * Register the application service providers.
     *
     * @param  array  $providers
     * @return void
     */
    public function load(array $providers)
    {
        $manifest = $this->loadManifest();

        // First we will load the service manifest, which contains information on all
        // service providers registered with the application and which services it
        // provides. This is used to know which services are "deferred" loaders.
        if ($this->shouldRecompile($manifest, $providers)) {
            $manifest = $this->compileManifest($providers);
        }

        // Next, we will register events to load the providers for each of the events
        // that it has requested. This allows the service provider to defer itself
        // while still getting automatically loaded when a certain event occurs.
        foreach ($manifest["when"] as $provider => $events) {
            $this->registerLoadEvents($provider, $events);
        }

        // We will go ahead and register all of the eagerly loaded providers with the
        // application so their services can be registered with the application as
        // a provided service. Then we will set the deferred service list on it.
        foreach ($manifest["eager"] as $provider) {
            $this->app->register($provider);
        }

        $this->app->addDeferredServices($manifest["deferred"]);
    }

而再經(jīng)過定位,發(fā)現(xiàn)慢在這一行

        foreach ($manifest["eager"] as $provider) {
            $this->app->register($provider);
        }

又回到 IlluminateFoundationApplication

    /**
     * Register a service provider with the application.
     *
     * @param  IlluminateSupportServiceProvider|string  $provider
     * @param  array  $options
     * @param  bool   $force
     * @return IlluminateSupportServiceProvider
     */
    public function register($provider, $options = [], $force = false)
    {
        if (($registered = $this->getProvider($provider)) && ! $force) {
            return $registered;
        }

        // If the given "provider" is a string, we will resolve it, passing in the
        // application instance automatically for the developer. This is simply
        // a more convenient way of specifying your service provider classes.
        if (is_string($provider)) {
            $provider = $this->resolveProvider($provider);
        }

        if (method_exists($provider, "register")) {
            $provider->register();
        }

        // If there are bindings / singletons set as properties on the provider we
        // will spin through them and register them with the application, which
        // serves as a convenience layer while registering a lot of bindings.
        if (property_exists($provider, "bindings")) {
            foreach ($provider->bindings as $key => $value) {
                $this->bind($key, $value);
            }
        }

        if (property_exists($provider, "singletons")) {
            foreach ($provider->singletons as $key => $value) {
                $this->singleton($key, $value);
            }
        }

        $this->markAsRegistered($provider);

        // If the application has already booted, we will call this boot method on
        // the provider class so it has an opportunity to do its boot logic and
        // will be ready for any usage by this developer"s application logic.
        if ($this->booted) {
            $this->bootProvider($provider);
        }

        return $provider;
    }

在 register 方法中,根據(jù) get_class($provider) 和 執(zhí)行耗時,得出以下數(shù)據(jù)

步驟 耗時
IlluminateEventsEventServiceProvider 0.02197265625
IlluminateLogLogServiceProvider 0.005859375
IlluminateRoutingRoutingServiceProvider 0.011962890625
IlluminateAuthAuthServiceProvider 0.024169921875
IlluminateCookieCookieServiceProvider 0.0048828125
IlluminateDatabaseDatabaseServiceProvider 9.678955078125
IlluminateEncryptionEncryptionServiceProvider 0.00732421875
IlluminateFilesystemFilesystemServiceProvider 0.014892578125
IlluminateFoundationProvidersFormRequestServiceProvider 0.0009765625
IlluminateFoundationProvidersFoundationServiceProvider 0.416015625
IlluminateNotificationsNotificationServiceProvider 0.011962890625
IlluminatePaginationPaginationServiceProvider 5.04296875
IlluminateSessionSessionServiceProvider 0.072021484375
IlluminateViewViewServiceProvider 0.01318359375
CogLaravelLoveProvidersLoveServiceProvider 0.01708984375
DingoApiProviderRoutingServiceProvider 0.0146484375
DingoApiProviderHttpServiceProvider 0.03271484375
DingoApiProviderLaravelServiceProvider 20.23583984375
FideloperProxyTrustedProxyServiceProvider 0.001953125
InfyOmAdminLTETemplatesAdminLTETemplatesServiceProvider 0.001953125
InfyOmGeneratorInfyOmGeneratorServiceProvider 0.045166015625
JeroenNotenLaravelAdminLteServiceProvider 0.013671875
LaracastsFlashFlashServiceProvider 0.013916015625
LaravelfyValidatorServiceProvider 0.001953125
LshorzLuocaptchaLCaptchaServiceProvider 0.01171875
MaatwebsiteExcelExcelServiceProvider 6.778076171875
OvertrueLaravelWeChatServiceProvider 9.040771484375
PrettusRepositoryProvidersEventServiceProvider 0.00390625
PrettusRepositoryProvidersRepositoryServiceProvider 1.244140625
SpatiePermissionPermissionServiceProvider 0.3759765625
TymonJWTAuthProvidersLaravelServiceProvider 0.03515625
CollectiveHtmlHtmlServiceProvider 0.025146484375
YajraDataTablesHtmlServiceProvider 2.22314453125
YajraDataTablesButtonsServiceProvider 4.593017578125
YajraDataTablesDataTablesServiceProvider 0.333984375
AppProvidersAppServiceProvider 0.001953125
AppProvidersAuthServiceProvider 0.001953125
AppProvidersEventServiceProvider 0.001953125
AppProvidersRouteServiceProvider 0.001708984375
AppProvidersResponseMacroServicePrivoder 37.69677734375
OvertrueLaravelLangTranslationServiceProvider 0.01220703125
IlluminateValidationValidationServiceProvider 0.029052734375
IlluminateCacheCacheServiceProvider 0.01318359375
IlluminateHashingHashServiceProvider 0.031005859375

得出 RegisterProviders 瓶頸的結論

AppProvidersResponseMacroServicePrivoder 占用 37ms

DingoApiProviderLaravelServiceProvider 占用 20ms

IlluminateDatabaseDatabaseServiceProvider 占用 9ms

OvertrueLaravelWeChatServiceProvider 占用 9ms


BootProviders 耗時
服務提供者 啟動時間 請求時
IlluminateDatabaseDatabaseServiceProvider::boot 0.851074875 3.6809083125
IlluminateFoundationProvidersFormRequestServiceProvider::boot 0.022949875 0.0290524375
IlluminateNotificationsNotificationServiceProvider::boot 2.113769125 9.91894525
IlluminatePaginationPaginationServiceProvider::boot 0.062988125 0.089843
EasyWeChatComposerLaravelServiceProvider::boot 6.5910643125 22.644042875
CogLaravelLoveProvidersLoveServiceProvider::boot 0.6311035625 2.3010250625
DingoApiProviderLaravelServiceProvider::boot 9.228027375 53.9980465
FideloperProxyTrustedProxyServiceProvider::boot 0.1589356875 0.6091309375
InfyOmAdminLTETemplatesAdminLTETemplatesServiceProvider::boot 0.033691625 0.0410155
PrettusRepositoryProvidersEventServiceProvider::boot 0.020996375 0.0432120625
PrettusRepositoryProvidersRepositoryServiceProvider::boot 1.7600095625 8.361816625
LaracastsFlashFlashServiceProvider::boot 0.191894125 0.066894125
InfyOmGeneratorInfyOmGeneratorServiceProvider::boot 0.0832513125 0.019042875
JeroenNotenLaravelAdminLteServiceProvider::boot 3.2441405 17.807128625
LaravelfyValidatorServiceProvider::boot 2.940917875 10.8391118125
LshorzLuocaptchaLCaptchaServiceProvider::boot 0.0832513125 0.075683375
OvertrueLaravelWeChatServiceProvider::boot 0.074707125 0.0139165625
SpatiePermissionPermissionServiceProvider::boot 9.5026856875 15.3239749375
TymonJWTAuthProvidersLaravelServiceProvider::boot 1.070800125 11.508300125
YajraDataTablesDataTablesServiceProvider::boot 0.2839356875 1.0837404375
YajraDataTablesHtmlServiceProvider::boot 0.0827631875 0.0651856875
MaatwebsiteExcelExcelServiceProvider::boot 0.0461428125 0.0097655
YajraDataTablesButtonsServiceProvider::boot 0.0529785625 0.046875
AppProvidersAppServiceProvider::boot 0.1179191875 0.0979000625
AppProvidersAuthServiceProvider::boot 0.1901856875 0.437988125
AppProvidersEventServiceProvider::boot 0.196777375 0.8210441875
AppProvidersRouteServiceProvider::boot 4.6032714375 12.817871375
AppProvidersResponseMacroServicePrivoder::boot 5.6691893125 16.917968
LaravelTinkerTinkerServiceProvider::boot 0.3859868125 null
BarryvdhLaravelIdeHelperIdeHelperServiceProvider::boot 0.1750488125 null
原因分析

EasyWeChatComposerLaravelServiceProvider::boot 的啟動速度,略慢,分析原因: 代碼 Github boot 方法中,加載了路由。而 Laravel 的路由,確實是比較慢的。

[未完]

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

轉載請注明本文地址:http://systransis.cn/yun/30879.html

相關文章

  • PHP基于laravel框架獲取微博數(shù)據(jù)之一 模擬新浪微博登錄

    摘要:模擬登錄新浪微博的核心,也是與模擬登錄最大的不同,密碼加密。已經(jīng)實現(xiàn)模擬新浪微博登錄的功能,之后不再更新。 參考資料: http://www.csuldw.com/2016/11/10/2016-11-10-simulate-sina-login/ http://blog.csdn.net/fly_leopard/article/details/51148904 http://www....

    galois 評論0 收藏0
  • Laravel學習筆記之Model Observer模型觀察者

    摘要:說明本文主要學習下的模型觀察者,把一點點經(jīng)驗分享出來希望對別人能有幫助。模型觀察者這個功能能做很多事情,比如模型更新時發(fā)個通知。總結本篇文章主要學了下的模型觀察者,發(fā)現(xiàn)這個功能也能使代碼結構更清晰,覺得挺好的。 說明:本文主要學習下Laravel的Model Observer模型觀察者,把一點點經(jīng)驗分享出來希望對別人能有幫助。同時,作者會將開發(fā)過程中的一些截圖和代碼黏上去,提高閱讀效率...

    Crazy_Coder 評論0 收藏0
  • Java后端學習,你應該看那些書籍?

    摘要:全書分三大部分共章第章介紹的基礎知識安裝和基本語法第章介紹的基本編程機器學習基礎及中常用的第三方庫函數(shù),并介紹數(shù)據(jù)預處理的基本方法第章分別介紹常用的機器學習分析算法及深度學習等。每章都采用多個經(jīng)典案例圖文并茂地介紹機器學習的原理和實現(xiàn)方法。 最近在學習Java和全棧開發(fā),推薦一些有用的書籍 書架主要針對Java后端和全棧開發(fā)用的 書籍介紹 《Spring Boot 2.0企業(yè)級應用開發(fā)...

    QiuyueZhong 評論0 收藏0
  • Java后端學習,你應該看那些書籍?

    摘要:全書分三大部分共章第章介紹的基礎知識安裝和基本語法第章介紹的基本編程機器學習基礎及中常用的第三方庫函數(shù),并介紹數(shù)據(jù)預處理的基本方法第章分別介紹常用的機器學習分析算法及深度學習等。每章都采用多個經(jīng)典案例圖文并茂地介紹機器學習的原理和實現(xiàn)方法。 最近在學習Java和全棧開發(fā),推薦一些有用的書籍 書架主要針對Java后端和全棧開發(fā)用的 書籍介紹 《Spring Boot 2.0企業(yè)級應用開發(fā)...

    FreeZinG 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<