淺談減少Hyperf框架的掃描時間

原因

Hyperf框架為瞭防止用戶更新組件後,代理緩存沒有更新導致啟動報錯。增加瞭以下鉤子。

{
    "scripts": {
        "post-autoload-dump": [
            "init-proxy.sh"
        ]
    }
}

而init-proxy.sh腳本,會執行php bin/hyperf.php di:init-proxy命令清理代理緩存,並重新生成。

$ composer init-proxy

> init-proxy.sh

../../

Runtime cleared

Scanning app …

Scan app completed, took 195.76692581177 milliseconds.

Scanning vendor …

Scan vendor completed, took 510.0839138031 milliseconds.

This command does not clear the runtime cache, If you want to delete them, use `vendor/bin/init-proxy.sh` instead.

Proxy class create success.

Finish!

上述演示中,我們很清楚的可以看到花費的時間,現在不足1s其實還可以接受。但如果您的模型非常多,這個時間可能會是無法忍受的一個點。比如以下情況。

$ composer init-proxy

> init-proxy.sh

../../

Runtime cleared

Scanning app …

Scan app completed, took 3063.5998249054 milliseconds.

Scanning vendor …

Scan vendor completed, took 490.39006233215 milliseconds.

This command does not clear the runtime cache, If you want to delete them, use `vendor/bin/init-proxy.sh` instead.

Proxy class create success.

Finish!

解決辦法

以下解決辦法建立在正確使用 Model 的基礎上。比如不在 Model 中使用註解。檢測辦法是,不排除 Model 目錄的情況下生成一下代理緩存,查看是否生成 Model 相關的代理。

所以,我們可以主動修改Hyperf框架的掃描目錄,排除掉模型目錄。讓我們寫一段邏輯,修改annotations.php。

<?php
 
declare(strict_types=1);
 
use Symfony\Component\Finder\Finder;
 
return [
    'scan' => [
        'paths' => value(function () {
            $paths = [];
            $dirs = Finder::create()->in(BASE_PATH . '/app')
                ->depth('< 1')
                ->exclude(['Model']) // 此處按照實際情況進行修改
                ->directories();
            /** @var SplFileInfo $dir */
            foreach ($dirs as $dir) {
                $paths[] = $dir->getRealPath();
            }
            return $paths;
        }),
        'ignore_annotations' => [
            'mixin',
        ],
    ],
];

當我們再執行命令時,就會發現時間被大大縮短。

寫在最後

Hyperf 是基於 Swoole 4.4+ 實現的高性能、高靈活性的 PHP 協程框架,內置協程服務器及大量常用的組件,性能較傳統基於 PHP-FPM 的框架有質的提升,提供超高性能的同時,也保持著極其靈活的可擴展性,標準組件均基於 PSR 標準 實現,基於強大的依賴註入設計,保證瞭絕大部分組件或類都是 可替換 與 可復用 的。

框架組件庫除瞭常見的協程版的 MySQL 客戶端、Redis 客戶端,還為您準備瞭協程版的 Eloquent ORM、WebSocket 服務端及客戶端、JSON RPC 服務端及客戶端、GRPC 服務端及客戶端、Zipkin/Jaeger (OpenTracing) 客戶端、Guzzle HTTP 客戶端、Elasticsearch 客戶端、Consul 客戶端、ETCD 客戶端、AMQP 組件、Apollo 配置中心、阿裡雲 ACM 應用配置管理、ETCD 配置中心、基於令牌桶算法的限流器、通用連接池、熔斷器、Swagger 文檔生成、Swoole Tracker、Blade 和 Smarty 視圖引擎、Snowflake 全局 ID 生成器 等組件,省去瞭自己實現對應協程版本的麻煩。

Hyperf 還提供瞭 基於 PSR-11 的依賴註入容器、註解、AOP 面向切面編程、基於 PSR-15 的中間件、自定義進程、基於 PSR-14 的事件管理器、Redis/RabbitMQ 消息隊列、自動模型緩存、基於 PSR-16 的緩存、Crontab 秒級定時任務、Translation 國際化、Validation 驗證器 等非常便捷的功能,滿足豐富的技術場景和業務場景,開箱即用。

以上就是淺談減少Hyperf框架的掃描時間的詳細內容,更多關於減少Hyperf框架的掃描時間的資料請關註WalkonNet其它相關文章!

推薦閱讀: