在开发中,我们难免会遇到一些特殊的场景情况需要即时通讯,比如聊天室等这些场景,当然,你是做游戏开发的话这个就更加重要了,如果你是做php开发的,那么你肯定是用的http协议或https开发的数据传输(也就是网页开发),如果某天老板需要你开发一个聊天室,或是一个小游戏肿么办?这种东西跟常规的http和https协议不一样,它是单方面的发送和响应结果,而这个技术要求是能够双向的,即时的推送数据结果,针对与这个解决方案,大神们拿出了解决方案,socket。socket 的编程我想我们很多人都很陌生,因为平时都用的很少,也不怎么接触,看了一下php教程上的解释,对socket 的注解解释也很模糊,所以针对socket的编程,其实我们是学着很痛苦的。这时候福音就来啦,一门框架应用而生,拥有着完善的中文文档,workerman
wokerman 替我们封装了php 底层socket的具体操作,并且提供了相关的操作类,我们只需要通过workerman给我们提供的完善的封装方法就能解决绝大部分我们所遇到的问题。并且是一门高性能的框架
<?php
use Workerman\Worker;
use Workerman\Lib\Timer;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/Workerman/Autoloader.php';
// 注意:这里与上个例子不同,使用的是websocket协议
$ws_worker = new Worker("websocket://0.0.0.0:7272");
// 启动4个进程对外提供服务
$ws_worker->count = 4;
// 该workerman 进程名称
$ws_worker->name = 'test_workerman';
//设置启动用户权限身份
$ws_worker->user = 'www';
// 传输层协议
$ws_worker->transport = 'tcp';
// 设置所有连接的默认应用层发送缓冲区大小,单位字节
TcpConnection::$defaultMaxSendBufferSize = 3*1024*1024;
$ws_worker->onConnect = function($connection){
global $ws_worker;
//设置连接时间
$connection->lastTime = time();
//设置此连接数据缓冲区大小 单位字节 默认1M 现设置为2M
$connection->maxSendBufferSize = 2097134;
//连接关闭时,会触发此函数进行回调
$connection->onClose = function($connection){
echo "id : " . $connection->id . " 已成功关闭连接 \n";
};
};
//进程启动时执行此函数
$ws_worker->onWorkerStart = function($ws_worker){
Timer::add(3,function () use ($ws_worker){
$ctime = time();
// 遍历当前进程所有的客户端连接,发送当前服务器的时间 心跳检测
foreach($ws_worker->connections as $connection)
{
if($ctime - $connection->lastTime >= 60)
{
$connection->send("即将与服务器断开连接 : " . date('Y-m-d H:i:s'));
//断开连接
$connection->close('开始关闭连接');
}else{
$connection->send("当前时间是 : " . date('Y-m-d H:i:s'));
}
}
});
//只在进程id 为1的进程中运行如下任务
if($ws_worker->id === 0)
{
Timer::add(3,function(){
echo 123 . '\r\n';
});
}
};
//当收到客户端发来的数据后返回data给客户端
$ws_worker->onMessage = function($connection, $dataSource){
$data = json_decode($dataSource,true);
//$connection->send('hello 你的名字是' . $data->name);
$connection->lastTime = time();
// 向客户端发送hello $data
if(is_array($data) && isset($data['name']))
{
$connection->send('hello 你的名字是' . $data['name'] . " id : " . $connection->id);
}else{
$connection->send('hello ' . $dataSource . " id : " . $connection->id);
}
};
// 运行worker
Worker::runAll();
?>
官方完整文档就百度搜搜workerman 这门框架,以后做物联网,智能家居,等等高薪技术都会用到这门框架。