Hyperf 是一个高性能、高灵活性的渐进式 PHP 协程框架,内置协程服务器及大量常用的组件,性能较传统基于 PHP-FPM 的框架有质的提升,提供超高性能的同时,也保持着极其灵活的可扩展性,标准组件均基于 PSR 标准 实现,基于强大的依赖注入设计,保证了绝大部分组件或类都是 可替换 与 可复用 的。
因为hyperf需要安装环境依赖比较多,所以采用了docker镜像环境安装的形式来进行搭建,这样可以避免大多数因环境问题,依赖版本问题等。
准备工作
-
由于hyperf 基于swoole框架,所以只能在linux系统中运行,因此需要提前准备好一个linux的服务器或者linux系统的虚拟机,不推荐在windows系统中部署hyperf项目。推荐在linux上提前安装好宝塔。
-
在宝塔上安装nginx软件,方便对网站站点管理,设置反向代理。
-
在宝塔面板创建一个静态站点,因为hyperf在docker镜像中运行,所以创建站点时不需要设置php关联,
-
修改站点ningx的配置文件,将请求转发到指定的端口上,站点配置内容如下所示:
server { listen 80; server_name hyperf.lxkj828.com; location ~ /socket { # 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 ; # 将协议架构转发到对应节点,如果使用非https请改为http proxy_set_header X-scheme http; # 执行代理访问真实服务器 proxy_pass http://127.0.0.1:9502; } location / { root html; index index.html index.htm; proxy_pass http://127.0.0.1:9501; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
创建hyperf项目docker实例
-
使用docker命令创建镜像
docker run --name service \ -v /www/wwwroot/service.lxkj828.com:/data/project \ -p 9501:9501 -p 9502:9502 -it \ --privileged -u root \ --entrypoint /bin/sh \ hyperf/hyperf:7.4-alpine-v3.11-swoole
--name
【docker实例名称】-v
【主机目录:实例目录】 将主机目录映射到实例对应目录中-p
【实例端口:主机端口】 将实例端口映射到主机的指定端口上方便访问
-
设置镜像时区
rm /etc/localtime ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
-
常用指令
systemctl start docker
启动docker服务docker ps -a
查看所有docker实例docker restart hyperf
重启docker实例docker exec -it service /bin/bash
从宿主机以命令行形式进入docker实例cd /data/project/hyperf-skeleton
在docker实例中 移动到hyperf项目目录netstat -anp | grep 8502
查看指定端口占用进程id 例如端口8502kill -9 4578
杀死指定进程 关闭端口占用
安装hyperf框架
-
cd /data/project
移动到实例映射到宿主机的项目目录 -
使用设置命令将compoer 源设置为阿里云 提高下载速度
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer
-
composer create-project hyperf/hyperf-skeleton
使用框架安装命令进行框架安装 -
框架安装过程中会询问时区及组件安装情况,根据需要设置即可,没有安装的组件可以开发过程中动态添加没有影响
-
cd hyperf-skeleton/
移动到项目目录 安装必备组件 -
composer require hyperf/watcher --dev
安装热重载组件 -
php bin/hyperf.php vendor:publish hyperf/watcher
发布热重载配置 -
php bin/hyperf.php server:watch
使用热重载方式启动框架 -
框架无报错启动
-
访问静态网站域名,测试http服务是否能够正常使用
安装websocket服务(可选)
- 使用
composer
安装websocket组件composer require hyperf/websocket-server
- 打开
/config/autoload/server.php
增加websocket服务配置'servers' => [ [ 'name' => 'ws', 'type' => Server::SERVER_WEBSOCKET, 'host' => '0.0.0.0', 'port' => 9502, 'sock_type' => SWOOLE_SOCK_TCP, 'callbacks' => [ Event::ON_HAND_SHAKE => [Hyperf\WebSocketServer\Server::class, 'onHandShake'], Event::ON_MESSAGE => [Hyperf\WebSocketServer\Server::class, 'onMessage'], Event::ON_CLOSE => [Hyperf\WebSocketServer\Server::class, 'onClose'], ], ], ],
- 配置websocket路由
Router::addServer('ws', function () { Router::get('/socket', 'App\Controller\WebSocketController'); });
- 增加对应的控制器文件
declare(strict_types=1); /** * This file is part of Hyperf. * * @link https://www.hyperf.io * @document https://hyperf.wiki * @contact group@hyperf.io * @license https://github.com/hyperf/hyperf/blob/master/LICENSE */ namespace App\Chat\Controller; use Hyperf\Contract\OnCloseInterface; use Hyperf\Contract\OnMessageInterface; use Hyperf\Contract\OnOpenInterface; use Hyperf\Di\Annotation\Inject; use Swoole\Http\Request; use Swoole\Websocket\Frame; class WebSocketController implements OnMessageInterface, OnOpenInterface, OnCloseInterface { private $server; //收到消息处理函数 public function onMessage($server, Frame $frame): void { echo "收到客户端消息"; $server->push($frame->fd, $frame->data); } //链接关闭方法 public function onClose($server, int $fd, int $reactorId): void { $server->push($fd, 'Link closed'); } //链接打开方法 public function onOpen($server, Request $request): void { $server->push($request->fd, 'Link succeeded'); } }
- 使用ws链接进行调试 查看是否能够正常链接
ws://service.lxkj828.com/socket