淺談減少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其它相關文章!