# :-: **Hyperf学习记录**
## **安装Hyperf**
**前期准备**
* PHP >= 7.2
* Swoole PHP 扩展 >= 4.5,并关闭了`Short Name`
* OpenSSL PHP 扩展
* JSON PHP 扩展
* PDO PHP 扩展 (如需要使用到 MySQL 客户端)
* Redis PHP 扩展 (如需要使用到 Redis 客户端)
* Protobuf PHP 扩展 (如需要使用到 gRPC 服务端或客户端)
Swoole安装命令
`pecl install swoole`
根据提示关闭对应php禁用函数
**开始安装**
建议将composer镜像设置为阿里云镜像,加速国内下载速度
`composer config -g repo.packagist composer https://mirrors.aliyun.com/composer`
**安装hyperf**
`composer create-project hyperf/hyperf-skeleton`
根据提示关闭对应php禁用函数
## **一、登录JWT配置**
### 1、声明:
#### 2、本文来自:
https://packagist.org/packages/phper666/jwt-auth
#### 3、拉取依赖
`composer require phper666/jwt-auth`
#### 4、发布配置
`php bin/hyperf.php jwt:publish --config`
#### 5、jwt 配置
去配置`config/autoload/jwt.php`文件或者在配置文件`.env`里配置
#### 6.创建Jwt中间件
`php bin/hyperf.php gen:middleware JwtAuthMiddleware`
编辑中间件逻辑
## **二、定义枚举类**
#### 主要用于定义错误码和错误信息
## **安装**
`composer require hyperf/constants`
## **使用**
通过`gen:constant`命令可以快速的生成一个枚举类。
`php bin/hyperf.php gen:constant ErrorCode`
此生成命令仅在[hyperf/constants](https://github.com/hyperf/constants)组件版本大于等于 v2.0.1 版本时可用,小于此版本时请手动创建枚举类。
## **三、验证器**
## **安装**
### 1.引入组件包
`composer require hyperf/validation`
### 2.添加中间键 **!!!!**
验证器组件的 Server 在`config/autoload/middlewares.php`配置文件加上一个全局中间件`Hyperf\Validation\Middleware\ValidationMiddleware`的配置
~~~
<?php
return [
// 下面的 http 字符串对应 config/autoload/server.php 内每个 server 的 name 属性对应的值,意味着对应的中间件配置仅应用在该 Server 中
'http' => [
// 数组内配置您的全局中间件,顺序根据该数组的顺序
\Hyperf\Validation\Middleware\ValidationMiddleware::class
// 这里隐藏了其它中间件
],
];
~~~
如没有正确设置全局中间件,可能会导致`表单请求(FormRequest)`的使用方式无效。
## **四、Composer组件更新**
#### 如需手动加载新组件进项目,或更新组件操作可运行下面命令(初始化项目依赖)
~~~
composer install
~~~
或者
`composer update`
## **五、安装RabbitMQ**
#### *RabbitMQ*是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)
#### 如需使用Hyperf AMQP组件需先安装RabbitMQ
#### [hyperf/amqp](https://github.com/hyperf/amqp)是实现 AMQP 标准的组件,主要适用于对 RabbitMQ 的使用。
参考:https://blog.csdn.net/u010533511/article/details/90752530
##### **1.安装Erlang(RabbitMQ是基于Erlang语言开发)**
##### 从EPEL源安装(注意erlang版本与rabbitmq是否对应,过低会导致rabbitmq无法启动)
`yum install epel-release 启用EPEL软件源`
`yum install erlang 安装erlang`
##### 安装RabbitMQ
##### 下载需要的安装包
`wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.15/rabbitmq-server-3.6.15-1.el7.noarch.rpm`
#####下载完成后安装:
`yum install rabbitmq-server-3.6.15-1.el7.noarch.rpm`
#### **2.安装完成后添加开机启动RabbitMQ服务**
`systemctl enable rabbitmq-server.service`
#### **查看服务状态**
`systemctl status rabbitmq-server.service`
#### **启动服务**
`systemctl start rabbitmq-server.service`
#### **停止服务**
`systemctl stop rabbitmq-server.service`
#### **查看当前所有用户**
`rabbitmqctl list_users`
#### **查看默认guest用户的权限**
`rabbitmqctl list_user_permissions guest`
#### **由于RabbitMQ默认的账号用户名和密码都是guest。为了安全起见, 先删掉默认用户**
`rabbitmqctl delete_user guest`
#### **添加新用户**
`rabbitmqctl add_user username password`
#### **设置用户tag**
`rabbitmqctl set_user_tags username administrator`
#### **赋予用户默认vhost的全部操作权限**
`rabbitmqctl set_permissions -p / username ".*" ".*" ".*"`
#### **查看用户的权限**
`rabbitmqctl list_user_permissions username`
#### **3、开启web管理接口**
如果只从命令行操作RabbitMQ,多少有点不方便。RabbitMQ自带了web管理界面,只需要启动插件便可以使用
`rabbitmq-plugins enable rabbitmq_management`
#### **开启用户远程访问**
默认情况下,RabbitMQ的默认的guest用户只允许本机访问, 如果想让guest用户能够远程访问的话,只需要将配置文件中的loopback_users列表置为空即可,如下:
{loopback\_users, []}
另外关于新添加的用户,直接就可以从远程访问的,如果想让新添加的用户只能本地访问,可以将用户名添加到上面的列表, 如只允许admin用户本机访问。
{loopback\_users, [“admin”]}
#### **4.Hyperf加载AMPQ组件**
##### **安装**
`composer require hyperf/amqp`
##### **添加配置文件**
~~~php
php bin/hyperf.php vendor:publish hyperf/amqp
~~~
## **六、路由**
如果安装了 devtool 组件,可使用
`php bin/hyperf.php describe:routes`
命令获取路由列表信息, 并且提供 path 可选项,方便获取单个路由信息,对应的命令
`php bin/hyperf.php describe:routes --path=/foo/bar`。
## **七、Supervisor 部署**
#### 项目部署时发现ssh链接断开后hyperf进程,端口都还在运行,但是项目的接口失效,连接超时,翻阅文档发现可以用## **Supervisor部署**记录一下。
[Supervisor](http://www.supervisord.org/)是`Linux/Unix`系统下的一个进程管理工具。可以很方便的监听、启动、停止和重启一个或多个进程。通过[Supervisor](http://www.supervisord.org/)管理的进程,当进程意外被`Kill`时,[Supervisor](http://www.supervisord.org/)会自动将它重启,可以很方便地做到进程自动恢复的目的,而无需自己编写`shell`脚本来管理进程。
## [安装 Supervisor](https://hyperf.wiki/2.0/#/zh-cn/tutorial/supervisor?id=%e5%ae%89%e8%a3%85-supervisor)
这里仅举例`CentOS`系统下的安装方式:
~~~
# 安装 epel 源,如果此前安装过,此步骤跳过
yum install -y epel-release
yum install -y supervisor
~~~
## [创建一个配置文件](https://hyperf.wiki/2.0/#/zh-cn/tutorial/supervisor?id=%e5%88%9b%e5%bb%ba%e4%b8%80%e4%b8%aa%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6)
~~~
cp /etc/supervisord.conf /etc/supervisord.d/supervisord.conf
~~~
编辑新复制出来的配置文件`/etc/supervisord.d/supervisord.conf`,并在文件结尾处添加以下内容后保存文件:
~~~
# 新建一个应用并设置一个名称,这里设置为 hyperf
[program:hyperf]
# 设置命令在指定的目录内执行
directory=/var/www/hyperf/
# 这里为您要管理的项目的启动命令
command=php ./bin/hyperf.php start
# 以哪个用户来运行该进程
user=root
# supervisor 启动时自动该应用
autostart=true
# 进程退出后自动重启进程
autorestart=true
# 进程持续运行多久才认为是启动成功
startsecs=1
# 重试次数
startretries=3
# stderr 日志输出位置
stderr_logfile=/var/www/hyperf/runtime/stderr.log
# stdout 日志输出位置
stdout_logfile=/var/www/hyperf/runtime/stdout.log
~~~
## [启动 Supervisor](https://hyperf.wiki/2.0/#/zh-cn/tutorial/supervisor?id=%e5%90%af%e5%8a%a8-supervisor)
运行下面的命令基于配置文件启动 Supervisor 程序:
~~~
supervisord -c /etc/supervisord.d/supervisord.conf
~~~
## [使用 supervisorctl 管理项目](https://hyperf.wiki/2.0/#/zh-cn/tutorial/supervisor?id=%e4%bd%bf%e7%94%a8-supervisorctl-%e7%ae%a1%e7%90%86%e9%a1%b9%e7%9b%ae)
~~~
# 启动 hyperf 应用
supervisorctl start hyperf
# 重启 hyperf 应用
supervisorctl restart hyperf
# 停止 hyperf 应用
supervisorctl stop hyperf
# 查看所有被管理项目运行状态
supervisorctl status
# 重新加载配置文件
supervisorctl update
# 重新启动所有程序
supervisorctl reload
~~~
## **八、Model模型**
基于Laravel开发的ORM组件,使用方法类似于Laravel.
输出ORM封装的sql语句
`$query->toSql()`
输出sql对应的变量值
`$query->getBindings()`
## **九、邮件发送**
#### 安装PHPMailer扩展包
Composer安装
`composer require phpmailer/phpmailer`
#### 相关配置
开启qq或163邮箱POP3/SMTP服务,并获取授权码,其中163免费企业邮箱没有授权码,填入邮箱密码即可。
~~~
$mail->Password =
~~~
由于阿里,腾讯云等服务器几乎默认关闭了25端口,建议使用465或者587端口来发送邮件,邮箱服务器为
163企业邮箱
~~~
smtp.ym.163.com
~~~
163邮箱
~~~
smtp.163.com
~~~
qq邮箱
~~~
smtp.qq.com
~~~
使用465端口时,需配置
~~~
$mail->SMTPSecure = 'ssl';
~~~
使用587端口时,需配置(未测试)
~~~
$mail->SMTPSecure = 'tls';
~~~
使用ssl方式登录邮箱时,需**切记**开启服务器PHP openssl扩展!!!查看是否启用openssl扩展命令为
`php -m`
如有使用swoole需启用openssl,查看swoole是否启用openssl命令为
`php --ri swoole`