workerman

https://www.jianshu.com/p/00623acb3dad

http://doc.workerman.net/315113

http://blog.csdn.net/everysii/article/details/50721306

https://www.2cto.com/kf/201408/325193.html

http://www.bubuko.com/infodetail-2274068.html

http://www.cnblogs.com/tinywan/p/7414251.html

http://blog.csdn.net/u012158564/article/details/53130943

后端推送数据的解决方案有很多,比如轮询、Comet、WebSocket。 

1. 轮询对于后端来说开发成本最低,就是按照传统的方式处理Ajax请求并返回数据,在学校的时候实验室的项目一直都采用轮询,因为它最保险也最容易实现。但轮询带来的通信资源的浪费是无法忽视的,无论数据是否改变,都照常发送请求并响应,而且每次HTTP请求都带有很长的头部信息。

2. Comet的概念是长连接,客户端发送请求后,后端将连接保持下来,直到连接超时或后端返回数据时再重新建立连接,有效的将通信资源转移到了服务器上,实际消耗的是服务器资源。 

3. WebSocket是HTML5提供的一种全双工通信技术,通过“握手”实现客户端与服务器之间的通信,实时性好,携带的头部也较小,目前支持的浏览器如下

理想的情况是采取WebSocket与Comet结合的方式,对IE8等浏览器采取Comet方式,做降级处理。但是这样一来,后端需要实现两种处理请求的逻辑,即WebSocket与Comet。所以,本文加入Node.js,之所以这样做,是将处理WebSocket(或Comet)的逻辑转移到Node.js部分,不给后端“添麻烦”,因为在实际情况下,前端开发人员推动后端开发人员并不容易。Node.js作为浏览器与Java业务逻辑层通信的中间层,连接客户端与Tomcat,通过Socket与Tomcat进行通信(是Socket,不是WebSocket,后端需要实现Socket接口。

前段日子已经写过一篇关于websocket的文章,但是当时是用的nodejs来搭建websocket服务器,点击此处跳转到该博文。 但是咱毕竟是学PHP滴,所以掌握如何用PHP实现websocket功能是非常重要的。本文主要用到了一个高性能的PHP Socket服务器框架Workerman。Workerman基于PHP多进程以及libevent事件轮询库,PHP开发者只要实现一两个接口,便可 以开发出自己的网络应用,例如Rpc服务、聊天室服务器、手机游戏服务器等(框架下载地址:Linux版,Windows版)。

1、框架的部署

该框架完全由PHP编写而成,支持命名空间,支持类的自动加载,部署起来非常方便。我们首先创建一个空的PHP项目,然后将下载的Workerman框架解压到该项目即可。

2、创建socket服务器

wsserver.php代码如下:

[php] view plain copy
<?php   
use Workerman\Worker;   
require_once 'D:/website/socket/Workerman/Autoloader.php';   
  
//创建一个Worker监听127.0.0.1:8000, 使用websocket协议通讯   
$ws_worker = new Worker("websocket://127.0.0.1:8000");   
  
//启动4个进程对外提供服务   
$ws_worker->count = 4;   
  
//当接收到客户端发来的数据后显示数据并回发到客户端   
$ws_worker->onMessage = function($connection, $data) {   
//显示数据   
echo "you just received: $data\n";   
  
//向客户端回发数据   
$connection->send("you just send: $data");   
};   
  
//运行worker   
$ws_worker->runAll();   

注:该代码只能够在PHP_CLI模式下运行,打开cmd,运行php d:/website/socket/wsserver.php start即可开启服务器。

3、客户端程序

client.html代码如下:

[html] view plain copy
<!DOCTYPE html>   
<html>   
<head>   
<title>HTML5</title>   
<meta charset="utf-8" />   
<script src="./js/jquery.js"></script>   
<script>   
$(function() {   
var socket;   
var readyState = ["connecting", "connected", "closing", "closed"];   
/* 打开连接事件 */   
$("button:eq(0)").click(function() {   
try {   
/* 连接 */   
socket = new WebSocket("ws://127.0.0.1:8000");   
  
/* 绑定事件 */   
socket.onopen = function() {   
$("#msg").html("连接成功...");   
};   
  
socket.onmessage = function(e) {   
$("#msg").html($("#msg").html() + "<br />" + e.data);   
};   
  
socket.onclose = function() {   
$("#msg").html($("#msg").html() + "<br />关闭连接...");   
};   
} catch(exception) {   
$("#msg").html($("#msg").html() + "<br />有错误发生");   
}   
});   
  
/* 发送数据事件 */   
$("button:eq(1)").click(function() {   
/* 检查文本框是否为空 */   
if($("#data").val() == "") {   
alert("请输入数据!");   
return;   
}   
  
try {   
socket.send($("#data").val());   
$("#msg").html($("#msg").html() + "<br />发送数据:" + $("#data").val());   
} catch (exception) {   
$("#msg").html($("#msg").html() + "<br />发送数据出错");   
}   
  
/* 清空文本框 */   
$("#data").val("");   
});   
  
/* 断开连接 */   
$("button:eq(2)").click(function() {   
socket.close();   
});   
});   
</script>   
</head>   
  
<body>   
<h1>WebSocket示例</h1>   
<input type="text" id="data" />   
<button>打开连接</button>   
<button>发送数据</button>   
<button>关闭连接</button>   
<p id="msg"></p>   
</body>   
</html>   

4、测试

在浏览器中请求client.html,连接socket服务器,发送4次消息,查看客户端和服务端的运行情况。

客户端运行结果:

1.png

服务端运行结果:

2.png

5、将客户端发送来的数据存入数据库

只需简单的修改一下服务器代码即可,修改后的代码如下:

[php] view plain copy
<?php   
use Workerman\Worker;   
require_once 'D:/website/socket/Workerman/Autoloader.php';   
  
//创建一个Worker监听127.0.0.1:8000, 使用websocket协议通讯   
$ws_worker = new Worker("websocket://127.0.0.1:8000");   
  
//启动4个进程对外提供服务   
$ws_worker->count = 4;   
  
//初始化数据库连接   
$dsn = "mysql:host=localhost;dbname=chat;port=3306";   
$user = "root";   
$pwd = "yb0623";   
$pdo = new PDO($dsn, $user, $pwd);   
  
//当接收到客户端发来的数据后显示数据并回发到客户端   
$ws_worker->onMessage = function($connection, $data) {   
//显示数据   
echo "you just received: $data\n";   
  
//将数据插入到数据库   
global $pdo;   
$time = time();   
$insert = "insert into chat_message(content, time, from_id, to_id) values('$data', $time, 1, 2)";  
  
$pdo->exec($insert);   
  
//向客户端回发数据   
$connection->send("you just send: $data");   
};   
  
//运行worker   
$ws_worker->runAll();

    A+
发布日期:2017年09月11日  所属分类:未分类

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: