swoole的安装

1、环境确认,仅支持 Linux(2.3.32 以上内核)、FreeBSD、MacOS 三种操作系统,低版本 Linux 系统(如 CentOS 6)可以使用 RedHat 提供的 devtools 编译,参考文档, 在 Windows 平台,可使用 WSL(Windows Subsystem for Linux) 或 CygWin。

2、系统软件:

php-7.2 或更高版本
gcc-4.8 或更高版本
make
autoconf

3、下载swoole源码(三选一)

https://github.com/swoole/swoole-src/releases
https://pecl.php.net/package/swoole
https://gitee.com/swoole/swoole/tags

4、下载源代码包后,使用root权限的终端进入源码目录,执行下面的命令进行编译和安装(当前教程安装的是4.8.0版本

①进入下载的安装目录中:

cd swoole

②执行下面命令进入安装模块:

phpize && \

③设置configure中的安装目录

./configure --with-php-config=/www/server/php/72/bin/php-config

④最后通过以下命令执行安装:

make && make install

⑤执行完成后看看安装目录下有无swoole.so文件,php.ini中有无extension=swoole.so

#我成功安装后,swoole.so所在目录:
/www/server/php/72/lib/php/extensions/no-debug-non-zts-20170718/swoole.so

注:如果不知道第③步中的安装目录,则可以执行下面命令进行全局查找

find / -name php-config

swoole在非ssl证书下的使用

PHP代码部分

//创建WebSocket Server对象,监听0.0.0.0:9502端口
$ws = new \Swoole\WebSocket\Server('0.0.0.0', 9502);

//监听WebSocket连接打开事件
$ws->on('Open', function ($ws, $request) {
    $socket_id = $request->fd;
    $nowtime = date("Y-m-d H:i:s");
    echo "[{$nowtime}] {$socket_id}连接成功\n";
    $ws->push($socket_id, "swoole连接成功!\n");
});

//监听WebSocket消息事件
$ws->on('Message', function ($ws, $frame) {
    $socket_id = $frame->fd;
    $data = $frame->data;
    $nowtime = date("Y-m-d H:i:s");
    echo "[{$nowtime}] 收到的客户端信息: {$data}\n";
    $ws->push($socket_id, "收到的客户端信息: {$frame->data}");
});

//监听WebSocket连接关闭事件
$ws->on('Close', function ($ws, $fd) {
    $nowtime = date("Y-m-d H:i:s");
    echo "[{$nowtime}] socket_id为{$fd}的用户已关闭连接\n";
});

$ws->start();

运行swoole

php swoole.php

客户端JS代码部分:

var wsServer = 'ws://服务器IP地址:9502';
var websocket = new WebSocket(wsServer);
websocket.onopen = function (evt) {
    console.log("swoole连接成功!");
    websocket.send('测试数据')
};

websocket.onclose = function (evt) {
    console.log("swoole连接断开!");
};

websocket.onmessage = function (evt) {
    console.log('服务器返回的数据为: ' + evt.data);
};

websocket.onerror = function (evt, e) {
    console.log('发生错误: ' + evt.data);
};

注(踩的坑):

①检查防火墙9502端口是否开放

②以上教程在有ssl证书的情况下会连接失败

如何让swoole支持ssl证书下使用?

想在ssl证书下运行swoole,需要到swoole目录下重新安装程序:

①进入安装目录,执行下面命令进入安装模块:

执行下面命令进入安装模块:

phpize && \

②设置configure中的安装目录,并带有ssl安装,找不到目录参考上面find命令

./configure --enable-openssl --with-php-config=/www/server/php/72/bin/php-config

清除上次的make命令所产生的object文件(后缀为“.o”的文件)及可执行文件

make clean

④最后通过以下命令执行安装

make && make install

查看结果是否包含openssl

php --ri swoole

看结果中是否存在下面这行,时间可能不一致,但前半部分相同

openssl => OpenSSL 1.0.2k-fips  26 Jan 2017

swoole在ssl证书下运行方法?

方法一(亲测有效)

①客户端修改访问地址

var wsServer = 'ws://服务器IP地址:9502';
//上面改为下面,其他代码不动即可
var wsServer = 'wss://域名/自定义模块名(不要和代码中的功能模块名重复)';
//例如
var wsServer = 'wss://shx1024.top/websocket/';

②Nginx配置代理(其实是将指向https的服务重定向到http):

#在代理服务器上的nginx配置文件中的server中增加如下配置项
location /websocket/ {
    proxy_pass http://服务器IP地址:9502;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

③重新运行swoole

php  swoole.php

方法二(网络经验,未测试成功)

①客户端修改访问地址

var wsServer = 'ws://服务器IP地址:9502';
//上面改为下面,其他代码不动即可
var wsServer = 'wss://服务器IP地址:9502';

②服务器端为WebSocket服务器增加ssl证书,这样就可以直接通过wss://来请求服务器了

//使用SSL必须在编译swoole时加入--enable-openssl选项
$server = new Swoole\WebSocket\Server("0.0.0.0", 9502, SWOOLE_PROCESS, SWOOLE_SOCK_TCP | SWOOLE_SSL);
$server->set(
[
        'ssl_cert_file' => '证书cert地址',
        'ssl_key_file' => '证书key地址',
]
);
//注:宝塔SSL证书所在目录:/www/server/panel/vhost/ssl/你的网站域名

③重新运行swoole

php  swoole.php