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
- 本文链接: https://www.shx1024.top//index/article/details/article_id/87.shtml
- 版权声明:本博客所有文章除特别声明外,均默认采用 许可协议。