首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Hcms:从thinkphp到Hyperf拥抱swoole

Hcms:从thinkphp到Hyperf拥抱swoole

原创
作者头像
黄振炼
发布于 2023-07-17 02:51:38
发布于 2023-07-17 02:51:38
1K00
代码可运行
举报
文章被收录于专栏:HcmsHcms
运行总次数:0
代码可运行

为什么是Hyperf

首先除了Hyperf是swoole官方力推的框架之外,还是看重Hyperf的灵活性,特别是核心架构中的一些特性给了一种耳目一新的感觉,也许这些对于其他语言开发来说是很正常的,但是对php开发者来说启发是很大,例如注解、AOP面向切面编程。

很多时候大家都知道swoole是php的趋势,但是又不知道如什么地方可以完整而且全面的去了解swoole,市面上也有很多针对swoole封装的框架,设置thinkphp也有think-swoole组件,但是文档相关文章并不详细。虽然看过swoole官方的文档,也能明白其中的原理,但是苦于没有实践还是只能停留在理论层面。有了一个优秀的框架,就能够让你快速了解swoole。

对于之前一直用thinkphp的开发者来说,先不谈什么微服务这么高大上的,对swoole使用肯定是你绕不开的话题,也是提升开发能力不可缺失的一项。所以需要一个规范框架能够让你把swoole和传统 PHP-FPM 开发模式区分出来。

协程

相信我们在学习swoole或者是Hyperf的官方文档上都有对协程有个详细的描述了,我这里就简单概括来说,就是传统的PHP-FPM每个请求都是一个进程去处理,而且这些处理对于一些IO阻塞的操作(数据操作)不能并行处理所以相对来说效率会比较低。

所以简单讲,使用了协程更高效处理并发请求。

在Hyperf每个请求都是协程处理的,最典型的例子就是传统的PHP-FPM模式获取请求参数都是通过全局变量$_GET,$_POST 获得的,但是在协程的模式下,请求有专门的Request对象处理,获取请求的对象只能通过这些对象来处理,这些对象存储协程上下文中,所以当请求结束(协程的处理结束)这些存储在协程上下文的对象就会释放。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
  declare(strict_types=1);

use Psr\Http\Message\ServerRequestInterface;
use Hyperf\Context\Context;

function url($uri, $params = null, $with_domain = false): string
{
  //协程上下文获取请求
  $request = Context::get(ServerRequestInterface::class);
  return $url;
}<?php
  declare(strict_types=1);

use Psr\Http\Message\ServerRequestInterface;
use Hyperf\Context\Context;

function url($uri, $params = null, $with_domain = false): string
{
  //协程上下文获取请求
  $request = Context::get(ServerRequestInterface::class);
  return $url;
}

还有需要注意的传统单例模式(用静态变量存储对象)的方式在使用过程需要注意,因为静态变量是全局共享的,不同的请求拿到都是一样的。最好的方式就是通过协程上下文存储单例模式的对象。

注解与AOP

注解和AOP面向切面变成可以说是Hyperf框架最大的两点,可以说之前只是做过thinkphp框架的开发者对这两个特性会比较陌生,具体的用法了在Hyperf文档,在这里我做一个简单概括,注解就是对类、方法、属性进行代码层面的标识(注意他跟注释是不一样的),可以理解为他是代码的锚点或者说是标记。

有了这些注解标记后,就可以针对这些标记进行切入编程。下面就是面向切面编程步骤

  1. 对切入对象(类、方法、属性)注解
  2. 实现切面类,接管切入对象处理
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    /**
     * @View()
     * @GetMapping(path="index")
     */
    public function index() { }    /**
     * @View()
     * @GetMapping(path="index")
     */
    public function index() { }

当看到上面代码时候,发现上面的方法什么都没有实现,但是这个方法带有两个注解。那么就可以知道这个方法是通过AOP接管了执行。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
declare(strict_types=1);

namespace App\Aspect;

use App\Annotation\View;
use Hyperf\Di\Aop\AbstractAspect;
use Hyperf\Di\Aop\ProceedingJoinPoint;

/**
 * @Aspect()
 */
class ViewAspect extends AbstractAspect
{
    public $priority = -1;
    public $annotations = [
        View::class
    ];
    public function process(ProceedingJoinPoint $proceedingJoinPoint)
    {
        //接管执行前
        $res = $proceedingJoinPoint->process();
        //接管执行后
    }
}<?php
declare(strict_types=1);

namespace App\Aspect;

use App\Annotation\View;
use Hyperf\Di\Aop\AbstractAspect;
use Hyperf\Di\Aop\ProceedingJoinPoint;

/**
 * @Aspect()
 */
class ViewAspect extends AbstractAspect
{
    public $priority = -1;
    public $annotations = [
        View::class
    ];
    public function process(ProceedingJoinPoint $proceedingJoinPoint)
    {
        //接管执行前
        $res = $proceedingJoinPoint->process();
        //接管执行后
    }
}

priority 切面优先级

针对同一个注解、或者一个方法可能有多个注解的情况,切面(Aspect)执行是需要定义他们之间的优先级顺序,优先级执行类似中间件,优先级越高执行越靠后。

Hcms

对大多数传统PHP-FPM开发来说,想要学习swoole或者是Hyperf往往会角色误触入手,或者是都看过了swoole官方文档,但是有角色没有具体实践的项目。在这里我推荐了解一下一套开发管理框架Hcms,这是一套基于Hyperf开发,能够快速搭建一个管理后台的框架。其实包含了项目管理后台的权限、菜单管理、缓存管理,模块化开发等丰富的功能。

Hcms文档:https://www.yuque.com/huangzhenlian/hcms

Hcms项目:https://github.com/zhlhuang/hcms

后台管理系统

hcms本身是一套后台管理的系统,里面继承了权限、菜单管理,文件上传管理等一些常规的组件,也可以通过模块化安装加入通知消息处理、地理位置组件等一些即装即用的功能。

常用功能封装

这些功能都是我们在日常项目开发中经常会用到了,而且对这些功能进行进一步的封装,不需要在新的项目中就这些功能再次开发等。例如我们在使用Hyperf的异步队列的时候,可能对队列的执行情况进行收集,后台管理系统就会通过事件的监听,记录每个异步队列的执行情况,并发数据存在数据库中,方便随时查询。

规范化且灵活的项目配置

项目开发各个板块的配置一直都是开发中管理比较头疼时间,一般可能通过定义config文件写入,这样就是导致配置文件越来越多,而且不方便管理。Hcms中将所有配置都放在setting表中,每个模块的配置获取和修改都通过继承 AbstractSettingService来操作。同时后台管理也可以针对这些配置做图形化界面,使得配置方便又灵活。

模块安装

使用了hyperf开发者会发现,和thinkphp不一样,项目并没有类似thinkphp的"多应用"的基因。所有文件都是根据功能进行分类,例如Controller、Aspect等都是在app的目录下。

Hcms定义了Application目录,在该目录下存放是各个模块(应用),为后面模块化开发和安装提供基础条件。

模块安装

模块安装只要执行 php bin/hyperf.php hcms:install {module_name} module_name为安装的模块名称。

下图是通过命令好安装实现省市区联动、地理位置获取功能。

  • 远程安装

Hcms模块都会传到github组织后,在执行安装命令时检测不到有项目的模块目录,则会到该github组织中请求源码下载并安装。

PS:因为github在国内不稳定,可能会导致下载失败,可以直接通过浏览器下载放入到Application进行手动安装。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Hyperf 初体验-视图
根据文档 在根目录新建 /storage/view 和 /runtime/view 文件夹
hedeqiang
2019/12/18
1.5K0
【Swoole系列6.5】Hyperf中的其它事项
关于 Hyperf 其它的内容我们就不多说了,毕竟框架这东西用得多了自然也就熟悉了。最重要的是——我的水平还不足以去深入地分析这个框架!
硬核项目经理
2023/03/03
7170
【Swoole系列6.5】Hyperf中的其它事项
使用Hyperf中遇到的问题及解决方法【一】
在初期我以为是只要在NGINX端开启支持GZIP即可,后面发现NGINX的GZIP开关并不会影响其他客户端发送来的请求数据。框架默认只支持json格式,后面通过查看Issues发现有别人踩过类似的坑(需求)#5488。
99
2023/12/06
8510
使用Hyperf中遇到的问题及解决方法【一】
swoole入门 初识
如果你的业务中,有用到以上等特性,你又在用使用php,那么完全可以用swoole来完成了,再具体点的场景如下:
风清醉
2019/12/18
1.2K0
Hyperf 初体验-AOP 切面
再说 AOP 之前,肯定都知道 OOP 是什么,面向对象编程。那么 AOP 就是 面向切面编程
hedeqiang
2019/12/17
1.8K0
Hyperf 发布 Swoole Enterprise 及 视图 及 Task 组件 | 企业级的 PHP 微服务协程框架
本次更新主要新增了 Swoole Enterprise 组件 和 视图 组件 和 Task 组件,同时强化了 JSON RPC 的异常处理和完善了 JSON RPC 在 TCP 协议下的服务注册及管理,以及修复了一些其它组件的 Bug,发布于 1.0.6 版。 相关组件的文档可通过上面的超链接进入查看,或直接访问 官网 https://www.hyperf.io 或 文档 https://doc.hyperf.io 查看。
桶哥
2019/07/30
1K0
Hyperf结合Redis异步队列任务async-queue实现后台操作日志写入
由于是集团后台,这样操作者就很多,但操作日志却是很关键的信息,必须得写入数据库,这样多用户写入,我们就得用到异步队列进行消费,防止写入失败,如果队列进行消费指定参数后还是失败,就得写入日志进行钉钉消息推送,具体可以看我另外一篇文章:
OwenZhang
2022/01/20
3.3K0
Hyperf结合Redis异步队列任务async-queue实现后台操作日志写入
带你学习hyperf-1.3 注意事项
1.3 注意事项 Hyperf 依赖swoole并基于cli,不需要使用nginx与php-fpm,所以即使本地没有这2个服务依旧可以运行起来 Hyperf在每次更新代码时都需要重载文件,即关闭进程重新执行php bin/hyperf.php start命令 Hyperf中存在很多与laravel框架中也在使用的composer包,所以也可以在必要的时候去参考laravel文档,当然也有不同,会在下文进行举例 关于注解与切面的知识点,可以提前了解,如果不是了解也不会很影响正常的业务功能开发 在此之前你需要了
美团骑手
2021/12/24
6800
带你学习hyperf-6.1 问题汇总
6.1 问题汇总 1. Guzzle Http客户端 请求时未记录日志文件,并将日志打印至终端 解决方案: 升级swoole至最新 2. hyperf与laravel 队列事务失败处理 场景: 当前有数据1,2,3投入队列,假设1,2,3都有创建的需求,投递至1时开启事务,并在未提交时,出现异常抛出了throw。此时数据2又进行消费执行创建,此时数据2会创建成功吗? 框架分别的处理方案: laravel:数据2不会创建成功,并且会影响之后的所有数据的创建 hyperf:数据2创建成功,并在终端抛出您可能上一
美团骑手
2021/12/24
4K0
Hcms实战1:控制器Controller
控制器Controller的作用定义路由、中间件和校验提交的数据。一些比较简单的业务处理逻辑都也可能会在Controller写,但是如果有比较稍微复杂的业务逻辑,都建议封装到Service中
黄振炼
2023/11/25
2290
hyperf微服务-概述
Hyperf 是一个高性能、高灵活性的渐进式 PHP 协程框架,内置协程服务器及大量常用的组件,性能较传统基于 PHP-FPM 的框架有质的提升,提供超高性能的同时,也保持着极其灵活的可扩展性,标准组件均基于 PSR 标准 实现,基于强大的依赖注入设计,保证了绝大部分组件或类都是 可替换 与 可复用 的。
白狼栈
2021/09/30
8610
php-websocket hyperf/websocket-server/client 客户端和服务器实时双向数据传输
WebSocket是一种通信协议,可在单个TCP连接上进行全双工通信。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就可以建立持久性的连接,并进行双向数据传输。
OwenZhang
2021/12/07
1.5K0
Swoft 2.0.5 更新,新增高效秒级定时任务、异常管理组件
Swoft 是一款基于 Swoole 扩展实现的 PHP 微服务协程框架。Swoft 能像 Go 一样,内置协程网络服务器及常用的协程客户端且常驻内存,不依赖传统的 PHP-FPM。有类似 Go 语言的协程操作方式,有类似 Spring Cloud 框架灵活的注解、强大的全局依赖注入容器、完善的服务治理、灵活强大的 AOP、标准的 PSR 规范实现等等。
桶哥
2019/08/08
9400
Swoft 2.0.5 更新,新增高效秒级定时任务、异常管理组件
带你学习hyperf-3.9 AOP 面向切面编程
AOP 为 Aspect Oriented Programming 的缩写,意为:面向切面编程,通过动态代理等技术实现程序功能的统一维护的一种技术。AOP 是 OOP 的延续,也是 Hyperf 中的一个重要内容,是函数式编程的一种衍生范型。利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
美团骑手
2021/12/24
1.3K0
Hyperf 初体验-中间件
程序员吐槽大会来解释中间件: 中间件就是,比如说马老师特别忙,每天很多人要见马老师,马老师不可能每个人都接待,很忙又不安全,这时候指定水彧来接待。所有人想找马老师都得先找水彧,马老师只跟水彧对接。这就是美曰其名的中间件。就是时代好了,以前这就叫太监...
hedeqiang
2019/12/17
1.3K2
Swoft 2 框架概览
最近在工作中使用到了一款swoole的衍生框架 Swoft ,虽然会有一些小毛病,但整体上还是不错的,安利一下,说不定就用上了呢?
江湖安得便相忘
2019/09/16
1.2K0
Hyperf + uni-app 使用 EasyWechat 实现微信小程序登录和支付
修改 SWOOLE_HOOK_FLAGS 编辑 bin/hyperf.php 文件
hedeqiang
2019/12/18
5K2
Hyperf + uni-app 使用 EasyWechat 实现微信小程序登录和支付
带你学习hyperf-7.1 特性
类似于 go 语言的 chan,Channel 可为多生产者协程和多消费者协程模式提供支持。底层自动实现了协程的切换和调度。 Channel 与 PHP 的数组类似,仅占用内存,没有其他额外的资源申请,所有操作均为内存操作,无 I/O 消耗,使用方法与 SplQueue 队列类似。 Channel 主要用于协程间通讯,当我们希望从一个协程里返回一些数据到另一个协程时,就可通过 Channel 来进行传递。
美团骑手
2021/12/24
1.4K0
Hyperf 1.1.0 正式发布了
Hyperf 1.1.0 更新内容比较多,但总的来说框架越来越完善。这次更新新增了 Validation 验证器 基于 Laravel,同时增加了大量的单侧。
hedeqiang
2019/12/17
6830
Hyperf 初体验-验证器
Hyperf 1.1.0 更新内容比较多,但总的来说框架越来越完善。这次更新新增了 Validation 验证器 基于 Laravel,同时增加了大量的单侧。
hedeqiang
2019/12/18
1.9K0
推荐阅读
相关推荐
Hyperf 初体验-视图
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验