Centos 安装 Swoole框架Hyperf过程_菠菜的专栏-CSDN博客
前文说了安装过程,现在说说一些基本配置。
1,启动界面输出了太多无用信息,需要精简
config/config.php
return [
'app_name' => env('APP_NAME', 'skeleton'),
'app_env' => env('APP_ENV', 'dev'),
'scan_cacheable' => env('SCAN_CACHEABLE', false),
StdoutLoggerInterface::class => [
'log_level' => [
LogLevel::ALERT,
LogLevel::CRITICAL,
//LogLevel::DEBUG,
LogLevel::EMERGENCY,
LogLevel::ERROR,
LogLevel::INFO,
//LogLevel::NOTICE,
LogLevel::WARNING,
],
],
];
注释 LogLevel::DEBUG 和 LogLevel::NOTICE 两行代码。
这个时候重启服务
php bin/hyperf.php start
[INFO] Worker#0 started.
[INFO] HTTP Server listening at 0.0.0.0:9501
[INFO] Worker#1 started.
干净清爽了。
2,默认启动的是一个 SERVER_HTTP 短链接服务,现在需要同时启用一个 WEBSOCKET长链接服务并自定义端口。
先安装组件 composer require hyperf/websocket-server
config/autoload/server.php 中的部分代码 如下
return [
'mode' => SWOOLE_PROCESS,
'servers' => [
[
'name' => 'http',
'type' => Server::SERVER_HTTP,
'host' => '0.0.0.0',
'port' => (int)env('HTTP_PORT', '9501'),
'sock_type' => SWOOLE_SOCK_TCP,
'callbacks' => [
Event::ON_REQUEST => ['S_HTTP', 'onRequest'],
],
],
[
'name' => 'ws',
'type' => Server::SERVER_WEBSOCKET,
'host' => '0.0.0.0',
'port' => (int)env('WS_PORT', '9502'),
'sock_type' => SWOOLE_SOCK_TCP,
'callbacks' => [
Event::ON_HAND_SHAKE => ['S_WS', 'onHandShake'],
Event::ON_MESSAGE => ['S_WS', 'onMessage'],
Event::ON_CLOSE => ['S_WS', 'onClose'],
],
]
],
'settings' => [...],
'callbacks' => [...],
],
];
其中的 S_WS S_THTP 在 config/autoload/dependencies.php 中定义
return [
//长链别名
"S_WS" => Hyperf\WebSocketServer\Server::class,
//短链别名
"S_HTTP" => Hyperf\HttpServer\Server::class,
];
重启服务
# php bin/hyperf.php start
[INFO] Worker#0 started.
[INFO] WebSocket Server listening at 0.0.0.0:9502
[INFO] HTTP Server listening at 0.0.0.0:9501
[INFO] Worker#1 started.
9502 端口的长连接服务就启用了。这个时候用 WebSocket Client 访问会出错,需要继续设置路由和对应的Controller
配置路由
文件内增加对应 ws 的 Server 的路由配置,
Router::addServer('ws', function () {
Router::get('/', 'App\Controller\WebSocketController');
});
Router::addRoute(['GET', 'POST', 'HEAD'], '/', 'App\Controller\IndexController@index');
Router::get('/favicon.ico', function () {
return '';
});
创建对应控制器
<?php
declare(strict_types=1);
namespace App\Controller;
use Hyperf\Contract\OnCloseInterface;
use Hyperf\Contract\OnMessageInterface;
use Hyperf\Contract\OnOpenInterface;
use Swoole\Http\Request;
use Swoole\Server;
use Swoole\Websocket\Frame;
use Swoole\WebSocket\Server as WebSocketServer;
class WebSocketController implements OnMessageInterface, OnOpenInterface, OnCloseInterface
{
public function onMessage($server, Frame $frame): void
{
$server->push($frame->fd, 'Recv: ' . $frame->data);
}
public function onClose($server, int $fd, int $reactorId): void
{
var_dump('closed');
}
public function onOpen($server, Request $request): void
{
$server->push($request->fd, 'Opened');
}
}
推荐一个 在线测试工具
在线websocket测试-online tool-postjson
至此你的websocket就建立起来了。