1. Hyperf概述
尽管现在基于PHP语言开发的框架处于一个百家争鸣的时代,但仍旧未能看到一个优雅的设计与超高性能的共存的完美框架,亦没有看到一个真正为PHP微服务铺路的框架,此为Hyperf及其团队成员的初衷。
Hyperf是一个高性能、高灵活性的渐进式PHP协程框架,内置协程服务器及大量常用的组件,性能较传统基于PHP-FPM的框架有质的提升,提供超高性能的同时,也保持着极其灵活的可扩展性,标准组件均基于PSR标准实现和强大的依赖注入设计,保证了绝大部分组件或类都是可替换与可复用的。
Hyperspeed + Flexibility = Hyperf,从名字上就可以看出超高速和灵活性是Hyperf的基因。对于超高速,Hyperf基于Swoole和Swow协程,并在框架设计上进行大量的优化以确保超高性能的输出。对于灵活性,Hyperf强大的依赖注入组件,组件均基于PSR标准的契约和由Hyperf定义的契约实现,达到框架内的绝大部分的组件或类都是可替换的。
Hyperf运行环境如下:
- Linux
- PHP 8.0+
- Swoole 4.5+ or Swow
2. 基础准备
下载软件包至本地:
[root@master ~]# curl -O http://mirrors.douxuedu.com/competition/Hyperf.tar.gz
解压软件包并导入镜像:
[root@master ~]# tar -zxf Hyperf.tar.gz
[root@master ~]# docker load -i Hyperf/images/centos_7.9.2009.tar
安装Docker Compose:
[root@master ~]# cp Hyperf/docker-compose-Linux-x86_64 /usr/bin/docker-compose
[root@master ~]# docker-compose version
docker-compose version 1.25.0, build 0a186604
docker-py version: 4.1.0
CPython version: 3.7.4
OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019
3. 容器化部署MySQL
(1)编写Dockerfile
编写init.sh脚本:
[root@master ~]# cd Hyperf/
[root@master Hyperf]# vi mysql_init.sh
#!/bin/bash
mysql_install_db --user=root
mysqld_safe --user=root &
sleep 8
mysqladmin -u root password 'root'
mysql -uroot -proot -e "grant all on *.* to 'root'@'%' identified by 'root'; flush privileges;"
mysql -uroot -proot -e " source /opt/hyperf_admin.sql;"
编写yum源:
[root@master Hyperf]# vi local.repo
[hyperf]
name=hyperf
baseurl=file:///root/yum
gpgcheck=0
enabled=1
编写Dockerfile文件:
[root@master Hyperf]# vi Dockerfile-mysql
FROM centos:7.9.2009
MAINTAINER Chinaskills
RUN rm -rf /etc/yum.repos.d/*
COPY local.repo /etc/yum.repos.d/
COPY yum /root/yum
ENV LC_ALL en_US.UTF-8
RUN yum -y install mariadb-server
COPY sql /opt/
COPY mysql_init.sh /opt/
RUN bash /opt/mysql_init.sh
EXPOSE 3306
CMD ["mysqld_safe","--user=root"]
(2)构建镜像
[root@master Hyperf]# docker build -t hyperf-mysql:v1.0 -f Dockerfile-mysql .
Sending build context to Docker daemon 643.8MB
Step 1/12 : FROM centos:7.9.2009
---> bae1bec259cb
Step 2/12 : MAINTAINER Chinaskills
---> Using cache
---> d2a088574726
Step 3/12 : RUN rm -rf /etc/yum.repos.d/*
---> Using cache
---> a2c179e2b75a
Step 4/12 : COPY local.repo /etc/yum.repos.d/
---> Using cache
---> 6db3f98be6d2
Step 5/12 : COPY yum /root/yum
---> Using cache
---> f4b3b9061b09
Step 6/12 : ENV LC_ALL en_US.UTF-8
---> Using cache
---> 523b8d138958
Step 7/12 : RUN yum -y install mariadb-server
---> Using cache
---> 0b66a990ade1
Step 8/12 : COPY sql /opt/
---> Using cache
---> 38b8501435f5
Step 9/12 : COPY mysql_init.sh /opt/
---> Using cache
---> 5f389602308d
Step 10/12 : RUN bash /opt/mysql_init.sh
---> Using cache
---> bf5471931b94
Step 11/12 : EXPOSE 3306
---> Using cache
---> 1e2eeada92b4
Step 12/12 : CMD ["mysqld_safe","--user=root"]
---> Using cache
---> f2312cf42712
Successfully built f2312cf42712
Successfully tagged hyperf-mysql:v1.0
4. 容器化部署Redis
(1)编写Dockerfile
[root@master Hyperf]# vi Dockerfile-redis
FROM centos:7.9.2009
MAINTAINER Chinaskills
RUN rm -rf /etc/yum.repos.d/*
COPY local.repo /etc/yum.repos.d/
COPY yum /root/yum
RUN yum -y install redis
RUN sed -i 's/127.0.0.1/0.0.0.0/g' /etc/redis.conf && \
sed -i 's/protected-mode yes/protected-mode no/g' /etc/redis.conf
EXPOSE 6379
CMD ["/usr/bin/redis-server","/etc/redis.conf"]
(2)构建镜像
[root@master Hyperf]# docker build -t hyperf-redis:v1.0 -f Dockerfile-redis .
Sending build context to Docker daemon 643.8MB
Step 1/9 : FROM centos:7.9.2009
---> bae1bec259cb
Step 2/9 : MAINTAINER Chinaskills
---> Using cache
---> d2a088574726
Step 3/9 : RUN rm -rf /etc/yum.repos.d/*
---> Using cache
---> a2c179e2b75a
Step 4/9 : COPY local.repo /etc/yum.repos.d/
---> Using cache
---> 6db3f98be6d2
Step 5/9 : COPY yum /root/yum
---> Using cache
---> f4b3b9061b09
Step 6/9 : RUN yum -y install redis
---> Using cache
---> 3604db0933a7
Step 7/9 : RUN sed -i 's/127.0.0.1/0.0.0.0/g' /etc/redis.conf && sed -i 's/protected-mode yes/protected-mode no/g' /etc/redis.conf
---> Using cache
---> 65610b0a9aa1
Step 8/9 : EXPOSE 6379
---> Using cache
---> dbb3373a6209
Step 9/9 : CMD ["/usr/bin/redis-server","/etc/redis.conf"]
---> Using cache
---> d8c3f4a447fe
Successfully built d8c3f4a447fe
Successfully tagged hyperf-redis:v1.0
5. 容器化部署Hyperf
(1)编写Dockerfile
[root@master Hyperf]# cat Dockerfile-hyperf
FROM centos:7.9.2009
ADD yum /root/yum
ADD swoole-v4.8.3.zip /tmp
RUN rm -rf /etc/yum.repos.d/*
ADD local.repo /etc/yum.repos.d/local.repo
RUN yum clean all
RUN yum install -y autoconf dpkg-devel dpkg-dev gcc gcc-c++ yum-utils tzdata unzip
RUN yum install -y php php-*
RUN cd /tmp && unzip swoole-v4.8.3.zip && mv swoole-v4.8.3 swoole
RUN cd /tmp/swoole && phpize && ./configure --enable-mysqlnd --enable-openssl --enable-http2 && make -s -j$(nproc) && make install
RUN echo 'extension=swoole.so' > /etc/php.d/20-swoole.ini
RUN echo "swoole.use_shortname = 'Off'" >> /etc/php.d/20-swoole.ini
RUN php --ri swoole
(2)构建镜像
[root@master Hyperf]# docker build -t hyperf-admin:v1.0 -f Dockerfile-hyperf .
Sending build context to Docker daemon 748MB
Step 1/13 : FROM centos:7.9.2009
---> eeb6ee3f44bd
Step 2/13 : ADD yum /root/yum
---> Using cache
---> 4dc92be0540a
Step 3/13 : ADD swoole-v4.8.3.zip /tmp
---> Using cache
---> 7cd702422151
Step 4/13 : RUN rm -rf /etc/yum.repos.d/*
---> Using cache
---> 65babffa6486
Step 5/13 : ADD local.repo /etc/yum.repos.d/local.repo
---> Using cache
---> ae992ad32138
Step 6/13 : RUN yum clean all
---> Using cache
---> 484e80f41425
Step 7/13 : RUN yum install -y autoconf dpkg-devel dpkg-dev gcc gcc-c++ yum-utils tzdata unzip
---> Using cache
---> 346bfd6340fa
Step 8/13 : RUN yum install -y php php-*
---> Using cache
---> 9425e16fa12a
Step 9/13 : RUN cd /tmp && unzip swoole-v4.8.3.zip && mv swoole-v4.8.3 swoole
---> Using cache
---> d12edd34a486
Step 10/13 : RUN cd /tmp/swoole && phpize && ./configure --enable-mysqlnd --enable-openssl --enable-http2 && make -s -j$(nproc) && make install
---> Using cache
---> 4198fe8c64dd
Step 11/13 : RUN echo 'extension=swoole.so' > /etc/php.d/20-swoole.ini
---> Using cache
---> 9fd3b28c6411
Step 12/13 : RUN echo "swoole.use_shortname = 'Off'" >> /etc/php.d/20-swoole.ini
---> Using cache
---> 48a0313c8d64
Step 13/13 : RUN php --ri swoole
---> Using cache
---> cd0dee04ddaa
Successfully built cd0dee04ddaa
Successfully tagged hyperf-admin:v1.0
6. 容器化部署前端服务
(1)编写Dockerfile
[root@master Hyperf]# vi Dockerfile-nginx
FROM centos:7.9.2009
MAINTAINER Chinaskills
RUN rm -rf /etc/yum.repos.d/*
COPY local.repo /etc/yum.repos.d/
COPY yum /root/yum
RUN yum -y install nginx
RUN /bin/bash -c 'echo init ok'
EXPOSE 80
CMD ["nginx","-g","daemon off;"]
(2)构建镜像
[root@master Hyperf]# docker build -t hyperf-nginx:v1.0 -f Dockerfile-nginx .
Sending build context to Docker daemon 643.8MB
Step 1/9 : FROM centos:7.9.2009
---> bae1bec259cb
Step 2/9 : MAINTAINER Chinaskills
---> Using cache
---> d2a088574726
Step 3/9 : RUN rm -rf /etc/yum.repos.d/*
---> Using cache
---> a2c179e2b75a
Step 4/9 : COPY local.repo /etc/yum.repos.d/
---> Using cache
---> 6db3f98be6d2
Step 5/9 : COPY yum /root/yum
---> Using cache
---> f4b3b9061b09
Step 6/9 : RUN yum -y install nginx
---> Using cache
---> 767105e717be
Step 7/9 : RUN /bin/bash -c 'echo init ok'
---> Using cache
---> 850dea3bff50
Step 8/9 : EXPOSE 80
---> Using cache
---> 0e06332a0dfc
Step 9/9 : CMD ["nginx","-g","daemon off;"]
---> Using cache
---> ffd462173f7d
Successfully built ffd462173f7d
Successfully tagged hyperf-nginx:v1.0
7. 编排部署Pig
(1)编写docker-compose.yml编排文件
[root@master Hyperf]# vi project/docker-compose.yaml
version: '3.1'
services:
app:
container_name: hyperf-admin
image: hyperf-admin:v1.0
command:
- /bin/sh
- -c
- |
cd /data
cp .env.dev.docker .env
php -d memory_limit=-1 `which composer` i --no-dev
rm -rf runtime/*
php bin/hyperf.php start
volumes:
- ./backend:/data
tty: true
links:
- mysql
- redis
environment:
HOST_IP: 127.0.0.1
HOST_PORT: 9511
mysql:
container_name: mysql
image: hyperf-mysql:v1.0
ports:
- 3307:3306
environment:
TZ: Asia/Shanghai
volumes:
- ./docker/data:/var/lib/mysql:rw
redis:
image: hyperf-redis:v1.0
container_name: redis
# command: redis-server
nginx:
image: hyperf-nginx:v1.0
container_name: nginx
ports:
- 8081:80
links:
- app
volumes:
- ./docker/conf.d:/etc/nginx/conf.d
- ./docker/log:/var/log/nginx
- ./frontend:/var/www/frontend
(2)部署服务
[root@master Hyperf]# docker-compose -f project/docker-compose.yaml up -d
Creating network "project_default" with the default driver
Creating mysql ... done
Creating redis ... done
Creating hyperf-admin ... done
Creating nginx ... done
查看服务:
[root@master Hyperf]# docker-compose -f project/docker-compose.yaml ps
Name Command State Ports
------------------------------------------------------------------------------
hyperf-admin /bin/sh -c cd /data Up
cp .en ...
mysql mysqld_safe --user=root Up 0.0.0.0:3307->3306/tcp
nginx nginx -g daemon off; Up 0.0.0.0:8081->80/tcp
redis /usr/bin/redis-server /etc ... Up 6379/tcp
在浏览器上通过http://IP:8081访问,如图1所示:
账号:daodao和密码: a1a1a1,点击登录。如图2所示:
至此,Hyperf框架就部署完成了。