MeiChat 支持基于 WebSocket 和 AJAX 的实时通信方式。如果您使用共享主机或服务器不支持 WebSockets,可以选择基于 AJAX 的实时方式。对于 WebSocket 功能,我们使用 PHP Swoole 实现高性能异步通信。

如何用WebSocket代替AJAX进行实时通信

  1. 点击 菜单
  2. 从侧边导航菜单选择 设置
  3. 选择 实时设置
  4. 在“ 实时模式 ”字段中,选择您的“ WebSocket
  5. 请在出现的表格中输入您的Swoole WebSocket连接详情
  6. 点击 “更新” 按钮。

供您参考:

  • “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进程,并在崩溃或服务器重启时自动重启。