PHP SWOOLE的webSocket建立长连接,实现服务端主动向客户端推送消息

最近被webSocket长连接坑哭了。。。

公司的小程序需要使用到服务器端主动向客户端推送消息,一开始朋友推荐使用workerman,废了九牛二虎之力,配置成功并且在web端也实现了服务端主动向页面推送消息。。。workerman需要引入封装好的io,打算挪到小程序的时候,一看...我的tian!!小程序不能引入外部在线js。。。

好吧,只能重新弄了,这次选择使用PHP的swoole扩展,下面进入正题


(https://gitee.com/swoole/swoole/tree/v1.9.21)
wget https://github.com/swoole/swoole-src/archive/v1.9.8.zip
 

tar zxvf v1.9.8.zip


cd swoole-src-1.9.8



(=号后面是php-config的完整路径)
./configure --with-php-config=/www/server/php/55/bin/php-config 


make  && make install



extension=/www/server/php/55/lib/php/extensions/no-debug-non-zts-20121212/swoole.so


二:服务端代码
/**
 * 启动webSocket服务类
 */
class websocket_server_start{
	
	public static $ws = null;
	
	public function __construct(){
		
		if(is_null(self::$ws)){
			
			/**
			 * @param 1 : IP
			 * @param 2 : 端口
			 * @param 3 : swoole运行模式
			 * @param 4 : SSL隧道加密TCP-Server
			 * 			  SWOOLE_SOCK_TCP | SWOOLE_SSL 表示此端口启用加密
			 */
			self::$ws = new swoole_websocket_server("0.0.0.0",9502,SWOOLE_BASE, SWOOLE_SOCK_TCP | SWOOLE_SSL);
		}
		
//		SSL文件路径
		self::$ws -> set(array(
			'ssl_cert_file'=>'/www/wwwroot/Public/ssl/214257688760806.pem',
			'ssl_key_file'=>'/www/wwwroot/Public/ssl/214257688760806.key',
		));
		
//		客户端建立连接,返回
		self::$ws -> on('open',function(swoole_websocket_server $ws,$request){
			var_dump($request);
		  	$ws -> push($request->fd,"websocket连接建立成功! \n");
		});
		
//		消息回复
		self::$ws -> on('message',function(swoole_websocket_server $ws,$request){
		  	self::$ws -> push($request->fd,json_encode($request,JSON_UNESCAPED_UNICODE));
		});
		
//		连接关闭
		self::$ws -> on('close',function(swoole_websocket_server $ws,$request){
			echo "cloes\n";
		});
		
		self::$ws -> start();
	}
	
}
new websocket_server_start();

1.png


三:客户端代码
<!DOCTYPE html>
<html>
	<head>
      <meta charset="UTF-8"/>
		<meta charset="{CHARSET}">
		<title></title>
	</head>
	<body>
		<script type="text/javascript">
			
//			实例化webSocket
			var webSocket = new WebSocket("wss://www.xxxx.com:9502");
			
//			建立socket连接
			webSocket.onopen = function(evt){
				console.log("连接成功");
			}
			
//			连接关闭
			webSocket.onclose = function(evt){
				console.log("连接关闭");
			}
			
//			接收webSocket发来的消息
			webSocket.onmessage = function(evt){
				console.log(evt.data);
			}
			
//			错误函数
			webSocket.onerror = function(evt,e){
				console.log(evt);
			}
		</script>
	</body>
</html>

5.png


四:在cli模式下启动webSocket
进入到放置服务端代码的目录,输入php websocket_server_start.php

2.png

检查一下线程,看看是否已经启动 ps -ajft

3.png


五:建立长连接

4.png

这里报了HTTP的400错误,打开上面写的客户端的文件

6.png

http模式下,webSocket已经建立,由于小程序只能在wss(https)下运行,再试试https,看看能不能链接成功

7.png

大功告成!http和https都没问题
我们在服务端代码open函数打印了客户端向服务端传递的数据,在Xshell下可以查看一下

8.png


***************当你发现自己的才华撑不起野心时,就请安静下来学习吧***************


客官,点击下方打赏一个呗~

点赞

发表评论