准备工作
- windows环境使用docker搭建
安装swoole扩展
在本地安装的话,以 Laradock 为例,需要在 laradock 目录下的 .env 中将下面两行配置值设置为 true
WORKSPACE_INSTALL_SWOOLE=true
PHP_FPM_INSTALL_SWOOLE=true
执行 docker-compose build php-fpm workspace 即可,执行完以后记得重启服务
- 项目根目录安装hhxsv5/laravel-s扩展
composer require hhxsv5/laravel-s
该扩展包具备自动发现功能(Laravel 5.5 以上版本可用),无需手动在 config/app.php 配置文件中注册,安装完成后,运行如下 Artisan 命令相应脚本和配置文件发布到根目录下:
php artisan laravels publish
可以查看https://github.com/hhxsv5/laravel-s/blob/master/README-CN.md文档
项目配置
修改config/laravels配置
‘websocket’ => [
‘enable’ => true, // 看清楚,这里是true
‘handler’ => \App\Services\WebSocketService::class,
],
‘swoole’ => [
// dispatch_mode只能设置为2、4、5,https://wiki.swoole.com/wiki/page/277.html
‘dispatch_mode’ => 2,
// …
],
env配置(本人使用的docker环境,其他环境请自行修改ip)
LARAVELS_LISTEN_IP=workspace
LARAVELS_DAEMONIZE=true
nginx反向代理配置
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
upstream swoole {
# 通过 IP:Port 连接
server workspace:5200 weight=5 max_fails=3 fail_timeout=30s;
keepalive 16;
}
server {
listen 80;
# 别忘了绑Host
server_name blogtest.localhost;
root /var/www/laravel_demo/public;
index index.php index.html index.htm;
# Nginx处理静态资源(建议开启gzip),LaravelS处理动态资源。
location / {
try_files $uri @laravels;
}
# 当请求PHP文件时直接响应404,防止暴露public/*.php
#location ~* \.php$ {
# return 404;
#}
# Http和WebSocket共存,Nginx通过location区分
# !!! WebSocket连接时路径为/ws
# Javascript: var ws = new WebSocket("ws://blogtest.localhost/ws");
location =/ws {
# proxy_connect_timeout 60s;
# proxy_send_timeout 60s;
# proxy_read_timeout:如果60秒内被代理的服务器没有响应数据给Nginx,那么Nginx会关闭当前连接;同时,Swoole的心跳设置也会影响连接的关闭
# proxy_read_timeout 60s;
proxy_http_version 1.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-PORT $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header Scheme $scheme;
proxy_set_header Server-Protocol $server_protocol;
proxy_set_header Server-Name $server_name;
proxy_set_header Server-Addr $server_addr;
proxy_set_header Server-Port $server_port;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_pass http://swoole;
}
location @laravels {
# proxy_connect_timeout 60s;
# proxy_send_timeout 60s;
# proxy_read_timeout 60s;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-PORT $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header Scheme $scheme;
proxy_set_header Server-Protocol $server_protocol;
proxy_set_header Server-Name $server_name;
proxy_set_header Server-Addr $server_addr;
proxy_set_header Server-Port $server_port;
proxy_pass http://swoole;
}
}
nginx配置查看https://laravelacademy.org/post/19700
swoole简单demo
- 创建 App\Services\WebSocketService.php
<?php
namespace App\Services;
use Hhxsv5\LaravelS\Swoole\WebSocketHandlerInterface;
use Swoole\Http\Request;
use Swoole\WebSocket\Frame;
use Swoole\WebSocket