美文网首页面向简历编程(重学php)
1.1 windows 上搭建hyperf环境

1.1 windows 上搭建hyperf环境

作者: 回眸淡然笑 | 来源:发表于2023-05-25 15:38 被阅读0次

1、安装docker客户端

开启Hyper-V

一、启用Hyper-V

打开控制面板 - 程序和功能 - 启用或关闭Windows功能,勾选Hyper-V,然后点击确定即可,如图:

1513668234-6433-20171206211858191-1177002365.png
下载windwos版本docker安装包 地址
如下图

启动docker.exe可能回报没有可用的linux系统或者wsl需要更新。
第一种情况处理办法:在 Microsoft Store 获取linux,这里我获取的是 ubuntu
image.png
第二种情况处理办法:下载wsl更新包,然后运行 wsl更新包

修改docker 镜像仓库

安装好后登陆docker(没有账号的请到官网进行注册)


image.png

使用git快速获取lnmp

windows上推荐使用cmder来代替cmd

cmdercmder是一个增强型命令行工具,不仅可以使用windows下的所有命令,更爽的是可以使用linux的命令,shell命令。

后面的步骤和在mac上的一样。毕竟docker是跨系统的,真香。

切换到你准备安装dnmp的目录下

$ git clone https://github.com/shmilylbelva/dnmp.git //建议使用https://github.com/yeszao/dnmp版本,功能更强大
$ cd dnmp
$ docker-compose up

即开始安装资源,如下图


image.png

完成以后可以在浏览器中访问localhost,出现以下界面代表ok。

image.png
出现 SQLSTATE[HY000] [1130] Host '172.19.0.2' is not allowed to connect to this MySQL servermysql提示,是因为目前使用mysql-server 8.0.28以上的版本,php版本需要7.4.7以上才能连接,所以需要修改yal文件php版本为7.4.7以上,然后重新build
$ docker stop php                      # 第一步:停止容器
$ docker rm php                     # 第二步:删除容器
$ docker-compose up -d --no-deps --build php  # 第三步:重新启动容器

其中最后一条命令参数作用:
-d:后台执行
--no-deps:不启动link的容器
--build:启动容器前先构建镜像

设置mysql远程可访问

新开一个终端进入mysql容器

docker ps //查看容器
docker exe -it mysql /bin/bash // 进入容器
mysql //进入mysql终端,应为初始mysql没有密码,所以直接能够进入
update mysql.user set host = '%' where user = 'root';//修改远程可访问
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';//修改密码为123456
FLUSH PRIVILEGES;//生效

刷新浏览器后,mysql连接成功


image.png

说明,连接MySQL这要分两种情况,

第一种情况,在PHP代码中

// 连接MySQL
$dbh = new PDO('mysql:host=mysql;dbname=mysql', 'root', '123456');

// 连接Redis
$redis = new Redis();
$redis->connect('redis', 6379);

因为容器与容器是expose端口联通的,而且在同一个networks下,所以连接的host参数直接用容器名称,port参数就是容器内部的端口。更多请参考《docker-compose ports和expose的区别》

第二种情况,在主机中通过命令行或者Navicat等工具连接。主机要连接mysql和redis的话,要求容器必须经过ports把端口映射到主机了。以 mysql 为例,docker-compose.yml文件中有这样的ports配置:3306:3306,就是主机的3306和容器的3306端口形成了映射,所以我们可以这样连接:

$ mysql -h127.0.0.1 -uroot -p123456 -P3306
$ redis-cli -h127.0.0.1

这里host参数不能用localhost是因为它默认是通过sock文件与mysql通信,而容器与主机文件系统已经隔离,所以需要通过TCP方式连接,所以需要指定IP。

dnmp目录结构

/
├── data                        数据库数据目录
│   ├── esdata                  ElasticSearch 数据目录
│   ├── mongo                   MongoDB 数据目录
│   ├── mysql                   MySQL8 数据目录
│   └── mysql5                  MySQL5 数据目录
├── services                    服务构建文件和配置文件目录
│   ├── elasticsearch           ElasticSearch 配置文件目录
│   ├── mysql                   MySQL8 配置文件目录
│   ├── mysql5                  MySQL5 配置文件目录
│   ├── nginx                   Nginx 配置文件目录
│   ├── php                     PHP5.6 - PHP7.4 配置目录
│   ├── php54                   PHP5.4 配置目录
│   └── redis                   Redis 配置目录
├── logs                        日志目录
├── docker-compose.sample.yml   Docker 服务配置示例文件
├── env.smaple                  环境配置示例文件
└── www                         PHP 代码目录

启动hyperf

docker exe -it php /bin/sh // 进入容器
cd HAdmin
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/  //配置阿里云镜像
install-php-extensions redis   安装php扩展swoole和redis
install-php-extensions swoole
composer install //安装composer包
php bin/hyperf.php start //启动hyperf
image.png image.png

修改php.ini 末尾添加swoole.use_shortname=Off,否则启动hyperf会报错

image.png
重新启动
php bin/hyperf.php start
image.png

配置nginx

因为我是本地win上搭建的docker,这里地址需要填写虚拟机的php容器地址

 docker exec -it php /bin/sh
image.png
upstream hyperf_websocket {
    server 172.18.0.5:9504;//虚拟机的php容器地址
}
server {
    listen       80;
    server_name  www.hadmin.dev;//设置的本地hosts域名
    root   /www/HAdmin;
    index  index.php index.html index.htm;
    #charset koi8-r;

    //  http部分
    location / {
        client_max_body_size    20m;
        # 将客户端的 Host 和 IP 信息一并转发到对应节点
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        # 转发Cookie,设置 SameSite
        proxy_cookie_path / "/; secure; HttpOnly; SameSite=strict";

        # 执行代理访问真实服务器
        proxy_pass http://172.18.0.5:9501;
        
    }
    //socket部分
    location /wss {
            # WebSocket Header
            proxy_http_version 1.1;
            proxy_set_header Upgrade websocket;
            proxy_set_header Connection "Upgrade";
            # 将客户端的 Host 和 IP 信息一并转发到对应节点
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            # 客户端与服务端无交互 60s 后自动断开连接,请根据实际业务场景设置
            proxy_read_timeout 60s ;
            # 执行代理访问真实服务器
            proxy_pass http://hyperf_websocket;
    }
    //  以下的不用
    access_log /dev/null;
    #access_log  /var/log/nginx/nginx.localhost.access.log  main;
    error_log  /var/log/nginx/nginx.localhost.error.log  warn;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }


    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ [^/]\.php(/|$) {
        fastcgi_pass   php:9000;
        include        fastcgi-php.conf;
        include        fastcgi_params;
    }

}

前端请求ws服务,需要填写该地址
ws://socket.tik-im.com/wss/default.io
因为Hadmin设置的ws服务路由规则为wss/default.io

image.png

相关文章

网友评论

    本文标题:1.1 windows 上搭建hyperf环境

    本文链接:https://www.haomeiwen.com/subject/zmbxedtx.html