http://www.wangjian2333.com/article.php?article=42
前段日子已经写过一篇关于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 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代码如下:
<!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次消息,查看客户端和服务端的运行情况。
客户端运行结果:
服务端运行结果:
5、将客户端发送来的数据存入数据库
只需简单的修改一下服务器代码即可,修改后的代码如下:
<?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();
再次向服务器端发送一次消息并查看数据库:
Workerman WebSocket示例
最新推荐文章于 2024-08-15 09:20:38 发布