Hyperf基础教程

前提说明

本教程适用于新手、老手,也适用于任何操作系统,包括Windows、linux、MacOS

 

介绍

Hyperf 是基于 Swoole 4.4+ 实现的高性能、高灵活性的 PHP 协程框架,内置协程服务器及大量常用的组件,性能较传统基于 PHP-FPM 的框架有质的提升,提供超高性能的同时,也保持着极其灵活的可扩展性,标准组件均基于 PSR 标准 实现,基于强大的依赖注入设计,保证了绝大部分组件或类都是 可替换 与 可复用 的。

框架组件库除了常见的协程版的 MySQL 客户端Redis 客户端,还为您准备了协程版的 Eloquent ORMWebSocket 服务端及客户端JSON RPC 服务端及客户端GRPC 服务端及客户端Zipkin/Jaeger (OpenTracing) 客户端Guzzle HTTP 客户端Elasticsearch 客户端Consul 客户端ETCD 客户端AMQP 组件Apollo 配置中心阿里云 ACM 应用配置管理ETCD 配置中心基于令牌桶算法的限流器通用连接池熔断器Swagger 文档生成Swoole Tracker视图引擎Snowflake 全局 ID 生成器 等组件,省去了自己实现对应协程版本的麻烦。

Hyperf 还提供了 基于 PSR-11 的依赖注入容器注解AOP 面向切面编程基于 PSR-15 的中间件自定义进程基于 PSR-14 的事件管理器Redis/RabbitMQ 消息队列自动模型缓存基于 PSR-16 的缓存Crontab 秒级定时任务国际化Validation 表单验证器 等非常便捷的功能,满足丰富的技术场景和业务场景,开箱即用。

官方文档

 

安装

先看下官方的文档说明

Hyperf 对系统环境有一些要求,仅可运行于 Linux 和 Mac 环境下,但由于 Docker 虚拟化技术的发展,在 Windows 下也可以通过 Docker for Windows 来作为运行环境,通常来说 Mac 环境下,我们更推荐本地环境部署,以避免 Docker 共享磁盘缓慢导致 Hyperf 启动速度慢的问题。

hyperf\hyperf-docker 项目内已经为您准备好了各种版本的 Dockerfile ,或直接基于已经构建好的 hyperf\hyperf 镜像来运行。

当您不想采用 Docker 来作为运行的环境基础时,您需要确保您的运行环境达到了以下的要求:

PHP >= 7.2
Swoole PHP 扩展 >= 4.4,并关闭了 Short Name
OpenSSL PHP 扩展
JSON PHP 扩展
PDO PHP 扩展 (如需要使用到 MySQL 客户端)
Redis PHP 扩展 (如需要使用到 Redis 客户端)
Protobuf PHP 扩展 (如需要使用到 gRPC 服务端或客户端)

 

可见,如果你打算再Windows上进行开发的话,那你可能会遇到一些困难,比如得装一个docker for windows或者装个虚拟机,由于有一部分win10系统是家庭版的,装docker for windows会遇到一些奇奇怪怪的问题,笔者建议不要采用这种方法

下面我将采用三种方法快速上手Hyperf

1、原生安装

适用范围:如果你是新手,你从来没有自己手动装过PHP环境,也没装过PHP相关扩展,你可以试试看这种方法,不过你得有耐心,因为你会遇到一系列奇奇怪怪的问题

难度指数:五星

2、使用docker安装

适用范围:如果你已经手动安装过PHP,配置过PHP环境以及相关扩展,想使用docker熟悉下,你可以试试看这种方式

难度指数:四星

3、docker-compose

适用范围:如果你有一定的docker操作经验,你可以使用这种一步到位的方法快速部署一个Hyperf项目

难度指数:三星

Tips:Linux或者MacOS用户可以跳过下面安装vmware虚拟机这一步

 

Windows用户安装 Vmware 和 Centos7(笔者用的是GUI版的Centos):

1、安装 Vmware 以及安装 Centos7,流程可以参考这位博主的文章,参考

2、配置一个共享文件夹,有什么作用呢,就是把你 Windows 上你的开发的项目映射到这台 Centos 虚拟机上,参考

3、配置虚拟机开机自动启动挂载脚本,目的是自动挂载上面的共享文件夹,不用自己手动操作,参考

 

快速开始

这里使用的是Hyperf的骨架项目,Github地址在这里

一、原生安装

原生安装的话,需要你的虚拟机要装有

  • PHP(7.2以上版本)
  • Swoole PHP 扩展 >= 4.4,并关闭了 Short Name
  • OpenSSL PHP 扩展
  • JSON PHP 扩展
  • PDO PHP 扩展 (如需要使用到 MySQL 客户端)
  • Redis PHP 扩展 (如需要使用到 Redis 客户端)
  • Protobuf PHP 扩展 (如需要使用到 gRPC 服务端或客户端)
  • 安装 Composer

1. PHP安装

安装教程可以参考这里,如果遇到编译错误的问题,参考这里,配置PHP命令参考这里

PS:如果执行“php -v”版本变成5.X,那可能是你之前装过其他版本了,参考这里

2. Swoole扩展安装,OpenSSL、JSON、Redis等也同理,注意,装之前运行"php -m"查看,没有的话再安装

Swoole参考这里,JSON参考这里,OpenSSL参考这里,Redis参考这里

PS:其他扩展看你自己项目需要,GD库参考这里,zip参考这里,fileinfo参考这里

3. 安装composer

参考这里

 

OK,弄完上面这里,基本上环境就差不多了,如果遇到安装报错的话,应该是安装PHP那部分会出错的比较多,其他的很少出问题,下面使用Composer把骨架项目弄一下

在虚拟机的共享文件夹下面找个地方,运行下面命令,将会创建一个Hyperf的骨架项目,类似于一个啥都没有的Demo

# composer create-project hyperf/hyperf-skeleton

 

安装过程中可能需要一些时间,然后进入到项目里面,运行下面命令启动项目

# php bin/hyperf.php start

 

这样,项目就启动好了,如果没报错的话到这里就OK了,然后是测试,有两种方式,一种是浏览器打开:http://localhost:9501,另外一种是curl

# curl localhost:9501
//或者
# curl 0.0.0.0:9501
//或者
# curl 127.0.0.1:9501

 

Windows系统要怎么开发呢,还记得上面共享了一个文件夹吗,直接打开那个共享文件夹就会看到刚刚创建的项目,然后用你的编译器打开进行码码码就行了

由于Hyperf是持久化的 CLI 框架,当您修改完您的代码后,通过 CTRL + C 终止当前启动的进程实例,并重新执行 php bin/hyperf.php start 启动命令即可。

你也可以去Github上把这个项目的代码拉下来,运行compose install安装相应的扩展,再启动

 

二、使用docker安装

前提:既然要用docker安装,那你就得装上docker命令,参考docker官方的文档进行安装即可

一些概念说明:

1、vmware虚拟机:这个是windows用户在vmware上装的虚拟机,比如上面的centos

2、docker容器:这个是在centos上运行docker run命令启动的虚拟机

3、查看docker镜像命令:docker imgaes

4、查看所有docker容器命令:docker ps -a

 

方法一:参考官方的安装方式

# Windows用户要注意了,由于这个是在centos上运行的,下面的主机指的是centos

# 下载并运行 hyperf/hyperf 镜像,并将镜像内的项目目录绑定到宿主机的 /tmp/skeleton 目录 docker run -v /tmp/skeleton:/hyperf-skeleton -p 9501:9501 -it --entrypoint /bin/sh hyperf/hyperf:7.2-alpine-cli # 镜像容器运行后,在容器内安装 Composer wget https://github.com/composer/composer/releases/download/1.8.6/composer.phar chmod u+x composer.phar mv composer.phar /usr/local/bin/composer # 将 Composer 镜像设置为阿里云镜像,加速国内下载速度 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer # 通过 Composer 安装 hyperf/hyperf-skeleton 项目 composer create-project hyperf/hyperf-skeleton # 进入安装好的 Hyperf 项目目录 cd hyperf-skeleton # 启动 Hyperf php bin/hyperf.php start

 

方法二:

其实上面的方式有点繁琐,看到骨架项目里面有一个Dockerfile文件,我们可以做一个镜像来处理

Dockerfile文件的内容,有没有很熟悉,其实就是上面那一块docker安装内容的整理,这里是把这些做成一个镜像

  
# Default Dockerfile
#
# @link     https://www.hyperf.io
# @document https://doc.hyperf.io
# @contact  group@hyperf.io
# @license  https://github.com/hyperf-cloud/hyperf/blob/master/LICENSE

FROM hyperf/hyperf:7.2-alpine-v3.9-cli
LABEL maintainer="Hyperf Developers <group@hyperf.io>" version="1.0" license="MIT"

##
# ---------- env settings ----------
##
# --build-arg timezone=Asia/Shanghai
ARG timezone

ENV TIMEZONE=${timezone:-"Asia/Shanghai"} \
    COMPOSER_VERSION=1.9.1 \
    APP_ENV=prod

# update
RUN set -ex \
    && apk update \
    # install composer
    && cd /tmp \
    && wget https://github.com/composer/composer/releases/download/${COMPOSER_VERSION}/composer.phar \
    && chmod u+x composer.phar \
    && mv composer.phar /usr/local/bin/composer \
    # show php version and extensions
    && php -v \
    && php -m \
    #  ---------- some config ----------
    && cd /etc/php7 \
    # - config PHP
    && { \
        echo "upload_max_filesize=100M"; \
        echo "post_max_size=108M"; \
        echo "memory_limit=1024M"; \
        echo "date.timezone=${TIMEZONE}"; \
    } | tee conf.d/99-overrides.ini \
    # - config timezone
    && ln -sf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime \
    && echo "${TIMEZONE}" > /etc/timezone \
    # ---------- clear works ----------
    && rm -rf /var/cache/apk/* /tmp/* /usr/share/man \
    && echo -e "\033[42;37m Build Completed :).\033[0m\n"

WORKDIR /opt/www

# Composer Cache
# COPY ./composer.* /opt/www/
# RUN composer install --no-dev --no-scripts

COPY . /opt/www
RUN composer install --no-dev -o

EXPOSE 9501

ENTRYPOINT ["php", "/opt/www/bin/hyperf.php", "start"]

 

既然有Dockerfile,我们直接吧这个Dockerfile做成一个镜像吧

做镜像的命令是:docker build -t 镜像名:版本号 .
PS:.表示最后的Dockerfile文件的位置,可以为绝对路径
eg:docker build -t dev:1.0 .
做完镜像后
运行 docker images看看你创建的镜像
然后就可以启动了
启动的命令说明:docker run
-v 主机卷:目标卷 -p 主机端口:目标端口 镜像名:版本号 eg:docker run -v /data/:/opt/www -p 9501:9501 dev:1.0
查看docker日志,加上
-f表示持续查看 docker logs -f 容器id

查看所有的容器
docker ps -a

 

记得你打包镜像的时候使用的镜像名跟版本号要跟后面启动的命令用的镜像名和版本号要保持一致

题外话,如果我想让这个docker容器跟另外一个docker容器,比如redis,要进行通信,要怎么做呢?参考这里

两个容器相互访问,使用--link

eg:docker run -v /data/:/opt/www -p 9501:9501 --link xxx1:redis xxx2

 

三、docker-compose

前提:安装docker-compose,参考这里

安装完docker-compose后,在centos虚拟机任何地方创建一个docker-compose.yml文件

version: '2.0'

services:
  hyperf-test:
    container_name: hyperf-test
    hostname: hyperf-test
    restart: always
    image: dev:1.0
    ports:
      - 9501:9501
    expose:
      - 9501
    volumes:
      - /mnt/hgfs/hyperf-test/:/opt/www

 

说明:

1、"/mnt/hgfs/hyperf-test" 这个目录是我挂载我windows主机到centos虚拟机的地址,可以自由换成你自己的地址

2、hyperf-test里面的image使用的镜像是第二步我们用Dockerfile做的镜像

 

创建完成后呢,在这个docker-compose.yml文件的目录下,参考下面命令把容器启动、停止、重启、删除

// 启动容器
# docker-compose up
// 停止容器
# docker-compose stop
// 重启
# docker-compose restart
// 停止容器并删除
# docker-compose down

 

跟第二步一样,如果我想让两个容器建立通信,docker-compose.yml要怎么写呢

version: '2.0'

services:
  redis2:
    image: redis
    container_name: redis2
    hostname: redis2
    restart: always
    command: --appendonly yes
    ports:
      - 6379:6379
    expose:
      - 6379
    privileged: true
    volumes:
      - /data/redis_data:/data

  hyperf-test:
    container_name: hyperf-test
    hostname: hyperf-test
    restart: always
    image: dev:1.0
    ports:
      - 9501:9501
    external_links:
      - redis2
    links:
      - redis2:redis
    depends_on:
      - redis2
    expose:
      - 9501
    volumes:
      - /mnt/hgfs/hyperf-test/:/opt/www

 

说明:

1、把redis的配置也写上

2、使用link关联两个容器

3、上面其实启动了两个容器,一个是redis,另外一个是hyperf,并且将两者建立一个连接

 

其中,由于redis使用挂载的方法,不会因为重启丢失数据,所以得先在主机目录/data/redis_data建好文件并设置好权限,如果后面启动再次出现权限问题:

  • 关闭SELinux,执行“setenforce 0”
  • docker-compose加上“privileged: true”
  • docker run 加上“--privileged=true”

docker-compose link使用方法参考这里

 

参考资料

Hyperf官方文档

 

posted @ 2020-05-03 13:41  凌雨尘  阅读(9912)  评论(0编辑  收藏  举报