workerman是github很star的开源项目,所以我们不重复造轮子,如果是想理解理解一下怎么实现的原理点这里,当然这个只是给我们理解一下(不要在意它全是bug,退出socket时会一直报错,Crtl+C结束他吧)
因为官方推荐将workerman引擎与thinkPHP分离,但我了解了一下scoket机制,发觉不分离以我现在的水平根本无法实现(我也找了很久,也没发现有人能实现的),业务逻辑全放在app上,而workerman只提供一个平台给我们传输数据。(workerman框架不只是这些,走一波手册)
workerman手册:http://doc.workerman.net/
GatewayWorker手册:http://doc2.workerman.net/
所以综上所述,我们需要另外打开一个cmd去运行workerman框架。
一、入口文件
文件目录:/ 新建文件:server.php (随便你写那里只要注意路径就可以了,我就写在根目录/)
<?php
define('APP_PATH', __DIR__ . '/application/');
define('BIND_MODULE','push/Worker');
// 加载框架引导文件
require __DIR__ . '/thinkphp/start.php';
二、业务逻辑
文件目录:/application/push/controller 新建文件:Worker.php
<?php
namespace app\push\controller;
header("Content-Type:text/html;charset=utf-8");
use think\worker\Server;
class Worker extends Server
{
protected $socket = 'websocket://127.0.0.1:1234';
/**
Workerman
* 收到信息
* @param $connection
* @param $data
*/
public function onMessage($connection, $data)
{
$connection->send('我收到你的信息了'.$data);
}
/**
* 当连接建立时触发的回调函数
* @param $connection
*/
public function onConnect($connection)
{
}
/**
* 当连接断开时触发的回调函数
* @param $connection
*/
public function onClose($connection)
{
}
/**
* 当客户端的连接上发生错误时触发
* @param $connection
* @param $code
* @param $msg
*/
public function onError($connection, $code, $msg)
{
echo "error $code $msg\n";
}
/**
* 每个进程启动
* @param $worker
*/
public function onWorkerStart($worker)
{
}
}
直接运行cmd运行入口文件
php server.php
成功
如果失败的请按我前几个博文重做
三、客户端视图层
随便在那里新建一个html,因为socket可以跨域,连开服务器都可以省去,也就是说可以直接双击打开文件,不信你可以试试, 我前端出身(虽然现在无业游民)不会骗你
<div><input type="text" id="setText"></div>
<div><button id= "sendMsg">提交</button></div>
<div>接受到信息:<span id="getText"></span></div>
<script>
var ws = new WebSocket('ws://127.0.0.1:1234');
ws.onopen = function () {
console.log('连接成功')
}
ws.onmessage = function (e) {
getText.innerHTML = e.data
}
ws.onclose = function () {
console.log('关闭')
}
sendMsg.onclick=function () {
ws.send(setText.value)
}
</script>