浅谈减少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框架的扫描时间的资料请关注我们其它相关文章!

(0)

相关推荐

  • php框架CI(codeigniter)自动加载与自主创建对象操作实例分析

    本文实例讲述了php框架CI(codeigniter)自动加载与自主创建对象操作.分享给大家供大家参考,具体如下: CI的autoload很好用,自动创建对象,但是注意,他的对象只有一个. 我们很多情况下需要生成对象,这就很麻烦. 好在我们可以有一些方法来创建. 下面记录一下使用library自定义类时,怎么使用自动加载或者用load的方法,以及自主生成任意多个实例的方法. 1.定义符合library要求的自定义类. 要定义自定义类,最好放到library,而要放到library必须将类改造成他

  • 详解Docker 下开发 hyperf 完整使用示例

    Hyperf官方网站 Hyperf 官方文档安装篇 1. docker 使用 docker search 列出 hyperf 镜像 docker pull 下载镜像到本地 运行 镜像并且将目录挂载到当前目录下文件夹 内,同时依照 /bin/sh 的方式运行 进入到 hyperf-skeleton 目录,此目录是和本地挂靠的 $ docker search hyperf $ docker pull hyperf/hyperf $ docker run -v $PWD/:/hyperf-skelet

  • PhpStorm 如何优雅的调试Hyperf的方法步骤

    前言: 我也是昨晚看了黄岛主的直播后学会的这个方法,今天中午趁着休息时间,把这个技巧分享给大家.就是大家在调试 Hyperf 的时候,可能总需要做一些服务的重启,重新点击 postman 的接口请求按钮,查看调试的结果是否正常,这篇文章就是教大家如何在 PhpStorm 中完成这一系列的操作. 一.Hyperf快速重启 第一步: 点击 PhpStorm 右上角的按钮,如图所示: 第二步: 点击弹框中左上角的添加按钮,然后再点击 PHP Script,如图所示: 第三步: 填写PHP脚本的信息:

  • 浅谈php常用的7大框架的优缺点

    一直以来,phper讨论最多的就是php各种框架的优缺点,网上的资料也是比较零散,现把几款主流的框架收集汇总一下,其中本人只是用过Yii2.Laravel.Yaf.Thinkphp这四种框架,因此大部分对各种框架的评价皆来自与网上资料,如果问题,请在评论中指出,共同进步 一.ThinkPHP ThinkPHP(FCS)是一个轻量级的中型框架,是从Java的Struts结构移植过来的中文PHP开发框架.它使用面向对象的开发结构和MVC模式,并且模拟实现了Struts的标签库,各方面都比较人性化,熟

  • php中Workerman框架实例讲解

    在我们探讨php框架的开发时,更多的是偏向于理论的框架.那么本篇要讲的Workerman框架,与其他的框架有很大的不同,可以广泛的应用在生活中.我们平时所用到的软件,也许正是Workerman开发出来的.下面我们就php中Workerman框架的概念.与其他框架区别带来讲解. 1.概念 Workerman是一款纯PHP开发的开源高性能的PHP socket 服务器框架.被广泛的用于手机app.移动通讯,微信小程序,手游服务端.网络游戏.PHP聊天室.硬件通讯.智能家居.车联网.物联网等领域的开发

  • Thinkphp5框架中引入Markdown编辑器操作示例

    本文实例讲述了Thinkphp5框架中引入Markdown编辑器操作.分享给大家供大家参考,具体如下: 编辑器下载地址以及演示:https://pandao.github.io/editor.md/ 1.把下载的项目放在public目录下 2.页面中引入jquery.js,editormd.js,editormd.css demo <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu

  • php框架知识点的整理和补充

    我们对于比较常见的php框架,已经基本上有所认识,不过一些比较冷门的框架也可以做一个了解,以便日后的特殊使用.本篇整理了4种php框架,在不同的使用方法上都独具特色,其中很多的框架不被大家熟知,下面我们就分别对每个框架做一个简单的介绍,一起看看具体内容吧. 1.Akelos AkelosPHP框架是RubyonRails相似的框架,是基于MVC设计模式的网络应用程序开发平台.Akelos对服务器的唯一要求是支持PHP,与其他类似框架相比代码应用程序少,因此可以在大多数共享主机服务器上运行,通过约

  • Thinkphp5框架异常处理操作实例分析

    本文实例讲述了Thinkphp5框架异常处理操作.分享给大家供大家参考,具体如下: 异常处理 有时候服务端会报出我们无法感知的错误,TP5默认会自动渲染错误的形式,生产环境中这样的形式并不是我们想要的. 未知错误 1.exception\Handle.php下的render方法需要覆盖 创建ApiHandleException.php <?php namespace app\common\lib\exception; use think\exception\Handle; class ApiHa

  • ThinkPHP5框架中使用JWT的方法示例

    本文实例讲述了ThinkPHP5框架中使用JWT的方法.分享给大家供大家参考,具体如下: JWT下载地址:https://jwt.io 可以直接去github上下载,也可以使用composer 使用composer的话要确保你的电脑上安装了composer,进入项目根目录下载即了,自动会放在vendor目录下 创建文件 我是放在common目录下 使用教程 github都有的 贴源码 JWTAuth.php <?php namespace app\common\Auth; use \Lcobuc

  • 浅谈减少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 ../../ R

  • 浅谈Python flask框架

    目录 1. flask 框架概述 1.1flask 框架优势 1.2flask 框架获取 1.3flask 框架使用 2. flask demo步骤 3. flask 基础功能 3.1路由功能 3.2模版提供 4.总结  前言: Python 面向对象的高级编程语言,以其语法简单.免费开源.免编译扩展性高,同时也可以嵌入到C/C++程序和丰富的第三方库,Python运用到大数据分析.人工智能.web后端等应用场景上. Python 目前主要流行的web框架:flask.Django.Tornad

  • 浅谈实时计算框架Flink集群搭建与运行机制

    一.Flink概述 1.1.基础简介 主要特性包括:批流一体化.精密的状态管理.事件时间支持以及精确一次的状态一致性保障等.Flink不仅可以运行在包括YARN.Mesos.Kubernetes在内的多种资源管理框架上,还支持在裸机集群上独立部署.在启用高可用选项的情况下,它不存在单点失效问题. 这里要说明两个概念: 边界:无边界和有边界数据流,可以理解为数据的聚合策略或者条件: 状态:即执行顺序上是否存在依赖关系,即下次执行是否依赖上次结果: 1.2.应用场景 Data Driven 事件驱动

  • 浅谈基于Pytest框架的自动化测试开发实践

    目录 01 - Pytest核心功能 02 - 创建测试项目 03 - 编写测试用例 04 - 执行测试用例 05 - 数据与脚本分离 06 - 参数化 07 - 测试配置管理 08 - 测试的准备与收尾 09 - 标记与分组 10 - 并发执行 11 - 测试报告 12 - 总结 参考资料 Pytest是Python的一种易用.高效和灵活的单元测试框架,可以支持单元测试和功能测试.本文不以介绍Pytest工具本身为目的,而是以一个实际的API测试项目为例,将Pytest的功能应用到实际的测试工

  • 浅谈Java三大框架与应用

    前言:对于一个程序员来说,尤其是在java web端开发的程序员,三大框架:Struts+Hibernate+Spring是必须要掌握熟透的,因此,下面谈谈java三大框架的基本概念和原理. JAVA三大框架 一.Spring Spring是一个解决了许多在J2EE开发中常见的问题的强大框架. Spring提供了管理业务对象的一致方法并且鼓励了注入对接口编程而不是对类编程的良好习惯.Spring的架构基础是基于使用JavaBean属性的Inversion of Control容器.然而,这仅仅是

  • 浅谈Java日志框架slf4j作用及其实现原理

    SLF4J是一个日志框架抽象层,底下绑定具体的日志框架,比如说Log4J,Logback,Java Logging API等.SLF4J也有自身的默认实现,但是我们还是主要以日志框架抽象层的身份使用SLF4J. 要使用SLF4J,得包含对"org.slf4j:slf4j-api"的依赖. 简单回顾门面模式 slf4j是门面模式的典型应用,因此在讲slf4j前,我们先简单回顾一下门面模式, 门面模式,其核心为外部与一个子系统的通信必须通过一个统一的外观对象进行,使得子系统更易于使用.用一

  • 浅谈express.js框架中间件(middleware)

    _express.js_作为_Node.js_的老牌框架,是现有框架中最全面的.然而在学习express除了那些api之外,对于框架最重要的就是__中间件__这个概念了.如果理解了,就可以把这个框架玩活了,项目开发肯定会更加顺利,而且还可以开发很多额外的功能,甚至中间件扩展开发. 但是就这么一个东西,是很多学习node.js的小萌新们就算写出一个博客项目,都不知道它到底有啥作用.我当时在理解的时候也花了不少功夫,趁着没有啥工作,给各位学习express.js的一点点我的指导意见.当然,这里面可能

  • 浅谈五大Python Web框架

    说到Web Framework,Ruby的世界Rails一统江湖,而Python则是一个百花齐放的世界,各种micro-framework.framework不可胜数,不完全列表见: http://wiki.python.org/moin/WebFrameworks 虽然另一大脚本语言PHP也有不少框架,但远没有Python这么夸张,也正是因为Python Web Framework(Python Web开发框架,以下简称Python框架)太多,所以在Python社区总有关于Python框架孰优

  • 浅谈Node.js ORM框架Sequlize之表间关系

    Sequelize模型之间存在关联关系,这些关系代表了数据库中对应表之间的主/外键关系.基于模型关系可以实现关联表之间的连接查询.更新.删除等操作.本文将通过一个示例,介绍模型的定义,创建模型关联关系,模型与关联关系同步数据库,及关系模型的增.删.改.查操作. 数据库中的表之间存在一定的关联关系,表之间的关系基于主/外键进行关联.创建约束等.关系表中的数据分为1对1(1:1).1对多(1:M).多对多(N:M)三种关联关系. 在Sequelize中建立关联关系,通过调用模型(源模型)的belon

  • 浅谈SSH框架中spring的原理

    在ssh项目中,是有明确分工的,spring的作用就相当于将struts和hibernate连接起来,是将两个没有关系的框架的特性,方法,action都放在spring的配置文件中使他们建立关系.取他门各自所长.而这些做法他们自己不知道,他们是听命于spring调度的,他的的任务只是做好自己的事情. 这样做的好处就是任务结构分明,struts只管理显示与做什么,hibernate只关心怎么做,而spring就相当于领导,所以一切的类都要交给spring的工厂创建,这是一种良好的开发模式,体现了一

随机推荐