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

因为hyperf需要安装环境依赖比较多,所以采用了docker镜像环境安装的形式来进行搭建,这样可以避免大多数因环境问题,依赖版本问题等。

准备工作

  1. 由于hyperf 基于swoole框架,所以只能在linux系统中运行,因此需要提前准备好一个linux的服务器或者linux系统的虚拟机,不推荐在windows系统中部署hyperf项目。推荐在linux上提前安装好宝塔。
  2. 在宝塔上安装nginx软件,方便对网站站点管理,设置反向代理。
  3. 在宝塔面板创建一个静态站点,因为hyperf在docker镜像中运行,所以创建站点时不需要设置php关联,
  4. 修改站点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实例

  1. 使用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 【实例端口:主机端口】 将实例端口映射到主机的指定端口上方便访问
  1. 设置镜像时区
rm /etc/localtime
    ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  1. 常用指令
  • 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 例如端口8502
  • kill -9 4578 杀死指定进程 关闭端口占用

安装hyperf框架

  1. cd /data/project 移动到实例映射到宿主机的项目目录
  2. 使用设置命令将compoer 源设置为阿里云 提高下载速度
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer
  1. composer create-project hyperf/hyperf-skeleton 使用框架安装命令进行框架安装
  2. 框架安装过程中会询问时区及组件安装情况,根据需要设置即可,没有安装的组件可以开发过程中动态添加没有影响
  3. cd hyperf-skeleton/ 移动到项目目录 安装必备组件
  4. composer require hyperf/watcher --dev 安装热重载组件
  5. php bin/hyperf.php vendor:publish hyperf/watcher 发布热重载配置
  6. php bin/hyperf.php server:watch 使用热重载方式启动框架
  7. 框架无报错启动
  8. 访问静态网站域名,测试http服务是否能够正常使用

安装websocket服务(可选)

  1. 使用composer安装websocket组件
composer require hyperf/websocket-server
  1. 打开/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'],
        ],
    ],
],
  1. 配置websocket路由
Router::addServer('ws', function () {
        Router::get('/socket', 'App\Controller\WebSocketController');
    });
  1. 增加对应的控制器文件
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');
     }
 }
  1. 使用ws链接进行调试 查看是否能够正常链接 ws://service.lxkj828.com/socket