MeiChat 支持基于 WebSocket 和 AJAX 的实时通信方式。如果您使用共享主机或服务器不支持 WebSockets,可以选择基于 AJAX 的实时方式。对于 WebSocket 功能,我们使用 PHP Swoole 实现高性能异步通信。
如何用WebSocket代替AJAX进行实时通信 ?
- 点击 菜单 。
- 从侧边导航菜单选择 设置 。
- 选择 实时设置
- 在“ 实时模式 ”字段中,选择您的“ WebSocket ”
- 请在出现的表格中输入您的Swoole WebSocket连接详情
- 点击 “更新” 按钮。
供您参考:
- “WebSocket Host” 指的是您的 WebSocket 服务器运行的 服务器地址 (主机名或 IP)。
-
WebSocket URL
是您的应用程序用来连接到 WebSocket 服务器的完整地址。它包括协议(或)、主机和端口(如有需要)。
ws://wss:// - WebSocket 端口 是您的 WebSocket 服务器监听来接入连接的特定端口号。端口 9501 和 9502 是 Swoole 通常用于 WebSocket 服务器的端口。
- WebSocket协议 决定连接是否 安全 。(wss:// 或 ws://)
如何在您的服务器上安装Swoole ?
首先,通过SSH连接服务器,直接从终端执行必要的命令。开始前,确保服务器上安装并启用了以下PHP扩展: sockets 、 openssl 和 mbstring 。
1)更新您的系统
sudo apt update && sudo apt upgrade -y
2)安装所需的依赖
sudo apt install php-pear php-dev
3)通过PECL安装Swoole
sudo pecl install swoole
4)启用Swoole PHP扩展
5)重启PHP、Apache或Nginx服务
6)设置一个使用 Apache 或 Nginx 的反向代理来处理 WebSocket URL。
如果您的服务器运行的是 Nginx,请添加以下配置,以启用访问您的 WebSocket,地址为 wss://your_domain/ws/ 。
location /ws/ {
proxy_pass http://127.0.0.1:9502;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
send_timeout 3600s;
keepalive_timeout 3600s;
}
如果您用的是Apache,编辑虚拟主机文件,并在模块内添加配置:
<VirtualHost>
<IfModule mod_proxy.c>
<IfModule mod_proxy_wstunnel.c>
ProxyPass "/ws/" "ws://127.0.0.1:9502/"
ProxyPassReverse "/ws/" "ws://127.0.0.1:9502/"
</IfModule>
</IfModule>
务必:
- 把 127.0.0.1 替换成您服务器的IP地址
-
如果您用的是别的 WebSocket 端口,请把端口改成您喜欢的 WebSocket
9502 - 在使用ProxyPass并mod_proxy_wstunnel之前,先确保启用所需的Apache模块。
7) 重启 PHP、Apache 或 Nginx 服务
8)检查它是否正常工作,
在终端里进入您的 MeiChat 文件夹,执行 PHP websocket.php 启动 WebSocket 服务器。
9)要将WebSocket作为后台进程运行,并在崩溃或服务器重启时自动重启,您可以按照以下步骤作:
— 增加文件描述符限制(可选但推荐)
grep -qxF '* soft nofile 65535' /etc/security/limits.conf || echo '* soft nofile 65535' | sudo tee -a /etc/security/limits.conf
grep -qxF '* hard nofile 65535' /etc/security/limits.conf || echo '* hard nofile 65535' | sudo tee -a /etc/security/limits.conf
要暂时将当前shell会话的文件描述符限制设置为65535,运行: ulimit -n 65535
— 为WebSocket创建systemd服务文件:
sudo nano /etc/systemd/system/websocket.service
—— 添加以下内容。把“replace_with_your_path”替换成您grupo目录的完整路径,并根据需要调整“User=www-data”。
[Unit]
Description=PHP WebSocket Server
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/replace_with_your_path
ExecStart=php /replace_with_your_path/websocket.php
Restart=always
RestartSec=3
LimitNOFILE=65535
StandardOutput=append:/var/log/websocket.out.log
StandardError=append:/var/log/websocket.err.log
[Install]
WantedBy=multi-user.target
— 重新加载systemd并启用WebSocket服务
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl enable websocket.service
sudo systemctl start websocket.service
这会在后台启动WebSocket进程,并在崩溃或服务器重启时自动重启。