当前位置: 首页 > news >正文

安装运行Hyperf

安装运行Hyperf

上回讲到,我们对一个普通的 Laravel 框架进行了改造,让它可以在 Swoole 环境下使用,不过其中会有很多问题可能我们一时考虑不到,就会造成程序的稳定性出现问题。那么,今天我们就来学习一个原生的 Swoole 框架 Hyperf 。

这个框架也是国人开发的,并且还一直比较活跃,同时版本也比较新,目前写这篇文章时是 2.2 版本,需要 Swoole 4.5 以上才可以使用,而 PHP 版本需要大于等于 7.4 以上。

另外需要注意的是,运行这个框架要关闭 Swoole 配置中的 use_shortname ,也就是 php.ini 文件中,设置一下 swoole.use_shortname=0 或者 swoole.use_shortname=off 就可以了。大家也可以先不配置,然后看下在启用 use_shortname 时,运行 Hyperf 框架会报什么错。

安装过程非常简单,直接 composer 安装即可。

composer create-project hyperf/hyperf-skeleton 

安装完了之后,看看目录,是不是就已经感觉和 Laravel 非常像了,怎么用呢?很简单,安装完了就可以在根目录执行下面这个命令行语句。

php bin/hyperf.php start

访问一下 localhost 的 9501 端口吧,我们就能看到 Hyperf 的首页已经输出了一段 json 语句。

{"method":"GET","message":"Hello Hyperf."}

恭喜你,安装完成了哦。

PHP8 的过时问题

在我的虚拟机环境中,因为安装的是 PHP8 所以在运行 Hyperf 的时候出现了下面的警告语句。

Deprecated: Return type of Hyperf\Database\Model\Model::offsetExists($offset) should either be compatible with ArrayAccess::offsetExists(mixed $offset): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/www/6.框架/hyperf-skeleton/vendor/hyperf/database/src/Model/Model.php on line 1156

这其实是 PHP8 的一个新特性,ReturnTypeWillChange 的意思就是如果你要是实现了一个接口中的方法,那么返回值也要定义成和接口中的方法定义一样的,如果没有定义返回值或者不一样,就会报这种过时警告。其实这不是什么大事,你可以忽略它。如果看得不习惯的话,找到框架中的代码源文件,比如上面的 Hyperf\Database\Model\Model 这个类文件,然后在它的 offsetExists() 方法上加上 #[\ReturnTypeWillChange] 注解,或者给这个 offsetExists() 方法指定返回值就行了。

后面录制视频时,会在本机使用 PHP7 环境,不会出现这个问题。

路由、控制器及视图页面

Hyperf 的路由文件在 config/routes.php 中,可以看到默认首页的路由是这样子的。

Router::addRoute(['GET', 'POST', 'HEAD'], '/', 'App\Controller\IndexController@index');

它指向一个控制器,写法不陌生吧。IndexController 中的内容是这样的。

class IndexController extends AbstractController
{public function index(){$user = $this->request->input('user', 'Hyperf');$method = $this->request->getMethod();
​return ['method' => $method,'message' => "Hello {$user}.",];}
}

也不陌生吧,注意,这里不要 echo 了哦,你可以 echo 一下试试,同样也是打印在控制台的,它最终输出的内容是需要 return 回去的,就像 Laravel 的 Response 对象一样。不过我们其实已经猜到了,这里的 Return 对象是会最终通过 Swoole 的 Response 对象发送回浏览器的。

我们也可以像 Laravel 那样定义直接操作的回调路由。

Router::get('/test1', function () {return 'This is Test1';
});

当然,我们也可以返回输出视图页面,不过这个要麻烦一点。为什么呢?因为 Hyperf 更倾向于去做后端服务,它的前端输出是需要单独再安装组件的。我们需要安装下面几个组件。

composer require hyperf/view
composer require duncan3dc/blade
composer require hyperf/task

然后生成一个 view 相关的配置。

php bin/hyperf.php vendor:publish hyperf/view

这时,会在 config/autoload 目录下多出一个 view.php 的配置文件,接着去配置它吧。

return ['engine' => \Hyperf\View\Engine\BladeEngine::class,  // 使用和 Laravel 一样的 Blade 模板引擎'mode' => Mode::TASK, // 使用 Task 模式,还需要单独去配置 Task 相关的配置'config' => ['view_path' => BASE_PATH . '/storage/view/', // 模板文件路径,不存在自己创建下'cache_path' => BASE_PATH . '/runtime/view/', // 模板缓存文件路径,不存在自己创建下],
];

其中,mode 可以选择 Mode::SYNC 和 Mode::TASK 两种模式,SYNC 是同步模式,要使用协程安全的模板引擎,所以官方更推荐使用 TASK 模式,但开启 TASK 模式又需要一些别的配置,主要就是配置一下 config/autoload/server.php 这个配置文件。

// 在 setting 中添加
'setting' =>[// ...// Task Worker 数量,根据您的服务器配置而配置适当的数量'task_worker_num' => 8,// 因为 `Task` 主要处理无法协程化的方法,所以这里推荐设为 `false`,避免协程下出现数据混淆的情况'task_enable_coroutine' => false,
],
// 在 callbacks 中添加
'callbacks' => [// Task callbacksEvent::ON_TASK => [Hyperf\Framework\Bootstrap\TaskCallback::class, 'onTask'],Event::ON_FINISH => [Hyperf\Framework\Bootstrap\FinishCallback::class, 'onFinish'],
]

准备工作好了之后,我们去 storage/view 目录下面新建一个 hello.blade.php 吧。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
hello {{$name}} !
</body>
</html>

然后定义一个控制器方法去使用这个模板文件并传值。

public function view(RenderInterface $render){return $render->render('hello', ['name' => 'Zyblog']);
}

RenderInterface 对象是通过依赖注入进来的一个模板渲染对象,直接调用它的 render() 方法就可以指定模板和传递参数了,其实和 Laravel 也很像,只是我们要做的准备工作更多一些。

注解定义路由

除了我们上面讲的和 Laravel 一样使用路由文件定义路由之外,我们还可以通过一种注解的方式来定义路由。

新建一个控制器。

namespace App\Controller;use Hyperf\HttpServer\Annotation\Controller;
use Hyperf\HttpServer\Annotation\RequestMapping;
use Hyperf\HttpServer\Contract\RequestInterface;#[Controller]
class AttributesController extends AbstractController
{/*** @RequestMapping(path="r", methods="get,post")*/public function route(RequestInterface $request){return ['This is Attributes Route Test','params', $request->all()];}
}

注意看哦,在类定义上面,我们使用了一个 PHP8 最新的原生注解。关于 PHP8 的注解功能,可以参考最下方参考链接中的第二条链接,鸟哥有详细的说明。然后在方法上,使用的 @RequestMapping(path="r", methods="get,post") 这种形式,它是 Hyperf 框架提供的注解能力。这两个注释的作用是什么呢?通过它们,我们可以不用去定义 routes.php 了,现在直接就可以通过 /attributes/r 来访问到这个控制器中的 route() 方法了哦,大家现在可以试试啦。

另外,还有一种更简单的路由定义方式,就是自动控制器注解。

/*** @AutoController()*/
class IndexController extends AbstractController{// ...public function test2(){return 'This is auto Test2';}
}

我把这个 AutoController 注解加到了 Index 控制器上,然后新定义了一个 test() 方法,试试用 /index/test2 这个链接来访问一下吧!

其实,注释实现的这一堆功能,很像是多年前那些老框架的实现,就像 tp3.2 时代,控制器中的方法路由就是以控制器类名和方法名来定义的。

命令行脚本

最后,我们再来看一下在 Hyperf 中如何定义运行一个 Command 脚本。这东西在 Laravel 中也很常用,而且它们非常相似。

创建命令行脚本的命令是:

php bin/hyperf.php gen:command TestCommand

运行之后在 app 目录下就会出现一个 Command 目录,里面就有一个 TestCommand.php 文件。

<?phpdeclare(strict_types=1);namespace App\Command;use Hyperf\Command\Command as HyperfCommand;
use Hyperf\Command\Annotation\Command;
use Psr\Container\ContainerInterface;/*** @Command*/
#[Command]
class TestCommand extends HyperfCommand
{/*** @var ContainerInterface*/protected $container;public function __construct(ContainerInterface $container){$this->container = $container;parent::__construct('test:show');
//        parent::__construct('demo:command');}public function configure(){parent::configure();$this->setDescription('Hyperf Demo Command');}public function handle(){$this->line('Hello Hyperf!', 'info');}
}

我们就改了一个命令的名称,然后在命令行这样执行它。

php bin/hyperf.php test:show
// [DEBUG] Event Hyperf\Framework\Event\BootApplication handled by Hyperf\Config\Listener\RegisterPropertyHandlerListener listener.
// [DEBUG] Event Hyperf\Framework\Event\BootApplication handled by Hyperf\ExceptionHandler\Listener\ExceptionHandlerListener listener.
// [DEBUG] Event Hyperf\Framework\Event\BootApplication handled by Hyperf\DbConnection\Listener\RegisterConnectionResolverListener listener.
// Hello Hyperf!

你没看错,Hyperf 的服务启动脚本和命令行启动脚本都是这个 bin/hyperf.php 文件,它还有很多其它的命令配置,后面不加参数就可以看到哦,和 Laravel 的 artisan 非常相似。

总结

今天的内容其实不少,但是经过这一篇的学习,其实我们对 Hyperf 就已经完成入门了。我们学习到了定义普通路由、注解路由,也看到了控制器和命令行的使用。后面我们将继续学习框架中的其它内容,但是,不会像 Laravel 一样进行源码级别的分析,只是简单讲讲使用哦,毕竟这个框架的复杂度又要高了不少。

测试代码:

https://github.com/zhangyue0503/swoole/tree/main/6.%E6%A1%86%E6%9E%B6/hyperf-skeleton

参考文档:

Hyperf

PHP 8新特性之Attributes(注解) - 风雪之隅

相关文章:

安装运行Hyperf

安装运行Hyperf 上回讲到&#xff0c;我们对一个普通的 Laravel 框架进行了改造&#xff0c;让它可以在 Swoole 环境下使用&#xff0c;不过其中会有很多问题可能我们一时考虑不到&#xff0c;就会造成程序的稳定性出现问题。那么&#xff0c;今天我们就来学习一个原生的 Swoo…...

回收站文件恢复,分享4个巧妙解决方法!

案例&#xff1a;回收站文件怎么恢复 【清理电脑时一不小心清空了我的回收站&#xff0c;有朋友知道该怎么恢复吗&#xff1f;急急急&#xff01;】 回收站对于电脑用户来说&#xff0c;可以带来很多的方便&#xff0c;能让用户能够在删除文件后将其恢复。但是&#xff0c;有…...

CTF权威指南 笔记 -第三章汇编基础-3.2-x86/x64汇编基础

这节介绍PC最常见的架构 x86和扩展 x64框架 CPU操作模式 对x86处理器而言 有三个最主要的保护模式 保护模式 实地址模式 系统管理模式还有一个保护模式的子模式 虚拟8086模式 保护模式 保护模式是处理原生状态 这个时候所有指令和特性都是可以使用的 分配给程序的独立内…...

争夺汽车芯片「高地」

一直以来&#xff0c;汽车芯片无论是工艺制程&#xff0c;还是新技术的导入&#xff0c;都要落后消费类产品几年时间。不过&#xff0c;如今&#xff0c;随着汽车智能化进一步推动汽车制造商与上游芯片设计公司、晶圆代工厂的紧密互动&#xff0c;历史即将翻篇。 同时&#xf…...

SuperMap GIS基础产品三维GIS FAQ集锦(2)

SuperMap GIS基础产品三维GIS FAQ集锦&#xff08;2&#xff09; 【WebGL】桌面对三维缓存设置了最大最小可见高度&#xff0c;在iServer发布三维服务并进行预览是可以看到该效果的&#xff0c;但在前端代码打开该服务&#xff0c;最大最小可见高度效果丢失&#xff0c;请问怎…...

11.streamFile

1.Stream流 1.1体验Stream流【理解】 案例需求 按照下面的要求完成集合的创建和遍历 创建一个集合&#xff0c;存储多个字符串元素把集合中所有以"张"开头的元素存储到一个新的集合把"张"开头的集合中的长度为3的元素存储到一个新的集合遍历上一步得到的集…...

如何裁剪图片大小尺寸?

如何裁剪图片大小尺寸&#xff1f;平时我们在工作或者学习的时候&#xff0c;会经常需要将图片上传到不同的网站或者平台上&#xff0c;然而上传的时候经常会受到尺寸的限制&#xff0c;有时候尺寸太大就需要变小&#xff0c;为了确保上传成功&#xff0c;我们需要将图片进行裁…...

深度学习笔记之梯度下降、反向传播与内置优化器

文章目录 1. 梯度下降法2. 反向传播算法3. PyTorch内置的优化器3.1 SGD优化器3.2 RMSprop优化器3.3 Adam优化器 1. 梯度下降法 笔者往期的机器学习笔记&#xff1a; 机器学习之梯度下降算法 梯度下降法是一种致力于找到函数极值点的算法。 所谓“训练”或“学习”就是改进…...

Visual Studio 2022 搭建GLFW OpenGL开发环境

最近工作需要 需要写一个全景的视频播放器 网上搜了下大概解决方案是 ffmpegopengl b站有很多视频 按照视频 搭建了OpenGL的开发环境 先去GLFW的网站下载 windows平台的库文件 为什么使用GLFW 因为GLFW是跨平台的 我下的是64位版本解压后有目录如下 包含了动态库和静态…...

四元数快速入门【Quaternion】

四元数&#xff08;Quaternion&#xff09;是用于旋转和拉伸向量的数学运算符。 本文提供了一个概述&#xff0c;以帮助理解在空间导航等应用程序中对四元数的需求。 推荐&#xff1a;用 NSDT场景设计器 快速搭建3D场景。 可以通过多种方式在空间中准确定位、移动和旋转物体。 …...

为什么我们要使用向量化运算

问题背景 如果你是matlab用户&#xff0c;你一般都会使用向量化运算进行编程。原因也许很简单&#xff0c;因为matlab针对向量化运算在底层做了深度优化&#xff0c;尤其是针对矩阵乘法调用了MKL之类的高度优化的第三库来加速。所以我们在推演算法的阶段&#xff0c;尽量的以向…...

Makefile零基础教学(一)初识makefile

从这篇文章开始就开始进入 Makefile 的零基础教程&#xff0c;相信只要看了本教程的都可以对 Makefile 有一个清晰的理解和正确的运用。那么现在就开始我们的 Makefile 学习之路。 文章目录 一、什么是 Makefile&#xff0c;优点&#xff1f;二、什么是 make, 为什么使用make?…...

如何使用SpringMVC之常用注解

❣️关注专栏&#xff1a;JavaEE Spring MVC ⌛️ 1. Spring MVC 创建和连接⌛️ 1.1 RequestMapping⌛️ 1.2 GetMapping⌛️ 1.3 PostMapping ⌛️ 2. 获取参数⌛️ 2.1 传递/获取单个参数⌛️ 2.2 传递/获取多个参数⌛️ 2.3 传递/获取对象⌛️ 2.4 参数重命名⌛️ 2.4.1 …...

Vue3的axios请求封装,请求拦截,相应拦截

对于三者放在Service.js中封装&#xff0c;方便使用 axios.create 的作用是创建一个新的 axios 实例&#xff0c;该实例可以具有自定义配置。通过使用 axios.create&#xff0c;您可以为任何 API 生成一个客户端&#xff0c;并在使用同一客户端的任何调用中重复使用相同的配置…...

ZC706P试验PL_DDR3内存条的步骤方法

ZC706P 板卡完全兼容XILINX官方的ZC706,当然也支持PL外挂的1G的DDR3内存条&#xff0c;这个片BLOG我提供从官方下载的一个文档和一个项目&#xff0c;演示一下验证DDR3的步骤。 步骤1&#xff1a;准备好板子&#xff0c;安装好软件。 链接&#xff1a;https://pan.baidu.com/s…...

通达信W底形态选股公式,也称双底形态

W底形态&#xff0c;也称双底形态&#xff0c;是一种经典的技术分析形态&#xff0c;代表了跌势的逆转。看起来像字母 "W"&#xff0c;描述了一波下跌&#xff0c;反弹&#xff0c;再次下跌到与上一波下跌相同或相近的位置&#xff0c;最后是另一波反弹。W底形态两次…...

java语言与算法、数据结构的用法

Java语言是一种广泛使用的计算机编程语言&#xff0c;也是开发各种软件和操作系统的重要工具之一。除了具有高效性和可移植性之外&#xff0c;Java语言还具有丰富的算法和数据结构支持&#xff0c;可以帮助程序员轻松地解决各种问题。 算法和数据结构是计算机科学中的两个基本…...

中国社科院与美国杜兰大学金融管理硕士项目,引领你走在金融行业前沿

作为金融领域从业人员时刻都在关注行业最新资讯&#xff0c;只有掌握一手的前沿讯息&#xff0c;才能在职场上无往不胜。针对在职的你&#xff0c;如何利用业余时间让自己更增值呢&#xff0c;中国社科院与美国杜兰大学金融管理硕士项目引领你走在金融行业前沿。 金融管理硕士…...

第三十五章 Unity人形动画(下)

本章内容主要就是动画数据的独立文件使用方式。有了独立的动画文件&#xff0c;我们就可以将其应用到其他模型上面了。最简单的方式就是&#xff0c;我们可以给其他模型编辑动画控制器的时候&#xff0c;使用这些动画文件。Unity则给我们提供了更加高级的共享方式&#xff0c;就…...

vue导入导出excel、设置单元格背景色、文字居中、合并单元格、设置列宽(使用xlsx库和xlsx-style库)

xlsx xlsx是由SheetJS开发的一个处理excel文件的npm库 适用于前端开发者实现导入导出excel文件的经典需求 为了区别于xlsx文件&#xff0c;突出其应用语言&#xff0c;该库通常又被称为js-xlsx 导出js数据为Excel文件 需要以下步骤&#xff1a; 安装 xlsx 库 你可以使用 …...

java 线程池

线程池 是 一个 容器&#xff0c;其中管理着多个线程&#xff08;预先创建并维护一定数量的线程&#xff09;&#xff0c;当有一个任务a需要一个线程去完成时&#xff0c;从容器&#xff08;线程池&#xff09;中获取一个线程A去执行任务a,当线程A完成任务a后&#xff0c;线程A…...

音频焦点使用及原理

音频焦点使用及原理 本博客代码基于Android 10源码 为什么会有音频焦点这一概念&#xff1f; 在Android音频领域中&#xff0c;应用层所有的App播放音频&#xff0c;最终都是走到音频回播线程PlaybackThread中&#xff0c;如果多个App都走到同一个PlaybackThread中去&#xff0…...

PyQt5桌面应用开发(8):从QInputDialog转进到函数参数传递

本文目录 PyQt5桌面应用系列How old are you, Dialog?QInputDialog minimalistwhy not lambdaand how partial worksSummary PyQt5桌面应用系列 PyQt5桌面应用开发&#xff08;1&#xff09;&#xff1a;需求分析 PyQt5桌面应用开发&#xff08;2&#xff09;&#xff1a;事件…...

2.0 Vue框架设计的核心要素

本章主要讲解&#xff0c;一个好的框架在构建的时候&#xff0c;需要考虑到的要素&#xff0c;包含报错信息反馈、警告信息反馈、减少打包体积、良好的输出、特性开关&#xff08;兼容&#xff09;等 1、提升用户开发体验 提升用户开发体验主要体现在用户使用框架进行开发时&…...

“智慧赋能 强链塑链”——精细化工行业仓储物流数字化转型探讨

精细化工行业作为衡量国家化学工业水平高低的重要标志&#xff0c;为国民经济提供重要的终端产品支持&#xff0c;相比较大化工产品&#xff0c;精细化工产品需要高度专业技能和工艺&#xff0c;其生产过程需要复杂的化学反应&#xff0c;以及严格的控制条件&#xff0c;产出的…...

用DG备库做的rman备份恢复一个数据库

环境描述&#xff1a; 1.因为主库存储空间不足&#xff0c;于是将备份放在dg备库上做。 2.主库因为磁盘空间问题&#xff0c;数据文件有两个目录。 3.dg备库因为主库两个数据文件目录里面有两个同名数据文件&#xff0c;所有dg备库也有两个数据文件目录。 4.主库与备库与测…...

JAVA中的IO操作有哪些?

在Java编程语言中&#xff0c;输入/输出&#xff08;IO&#xff09;操作是很重要的部分&#xff0c;它允许程序从外部系统读取数据&#xff0c;或将数据输出到外部系统。Java提供了一组强大的IO类库&#xff0c;可以让开发人员方便地进行各种IO操作。 Java中的IO操作可以分为两…...

10:00面试,10:04就出来了 ,问的实在是太...

从外包出来&#xff0c;没想到竟然死在了另一家厂子 自从加入这家公司&#xff0c;每天都在加班&#xff0c;钱倒是给的不少&#xff0c;所以我也就忍了。没想到12月一纸通知&#xff0c;所有人都不许加班&#xff0c;薪资直降30%&#xff0c;顿时有吃不起饭的赶脚。 好在有个…...

wangzherongyao PMO

感谢【五一节】大家的相遇&#xff0c;总结下。 2023年05月02日&#xff0c;【第一组】组队开黑 我总结了下这天为什么打的那么好&#xff0c;首先赛季初段位在王者附近&#xff0c;大家心态重视程度也高&#xff0c;不轻敌&#xff0c;也不盲目&#xff0c;运营好兵线一步一步…...

Dart语法上

一、Dart介绍及环境 1.1 Dart介绍&#xff1a; Dart是由谷歌开发的计算机编程语言,它可以被用于web、服务器、移动应用 和物联网等领域的开发。Dart诞生于2011年&#xff0c;号称要取代JavaScript。但是过去的几年中一直不温不火。直到Flutter的出现现在被人们重新重视。 要学…...