前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Hcms:从thinkphp到Hyperf拥抱swoole

Hcms:从thinkphp到Hyperf拥抱swoole

原创
作者头像
黄振炼
发布2023-07-17 10:51:38
5260
发布2023-07-17 10:51:38
举报
文章被收录于专栏:HcmsHcms

为什么是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
复制
<?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
复制
    /**
     * @View()
     * @GetMapping(path="index")
     */
    public function index() { }    /**
     * @View()
     * @GetMapping(path="index")
     */
    public function index() { }

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

代码语言:javascript
复制
<?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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么是Hyperf
  • 协程
  • 注解与AOP
    • priority 切面优先级
    • Hcms
      • 后台管理系统
        • 常用功能封装
        • 规范化且灵活的项目配置
      • 模块安装
        • 模块安装
    相关产品与服务
    对象存储
    对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档