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 例如端口8502 -
kill -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