浅谈减少Hyperf框架的扫描时间
发布:smiling 来源: PHP粉丝网 添加日期:2022-05-02 10:22:04 浏览: 评论:0
本文主要介绍了如何减少Hyper框架的扫描时间,对PHP协程框架感兴趣的同学,可以参考下。
原因
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 验证器 等非常便捷的功能,满足丰富的技术场景和业务场景,开箱即用。
Tags: Hyperf
- 上一篇:浅谈laravel中间件的创建思路
- 下一篇:最后一页
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)