php 即时通讯框架workerman,socket底层协议监听

在开发中,我们难免会遇到一些特殊的场景情况需要即时通讯,比如聊天室等这些场景,当然,你是做游戏开发的话这个就更加重要了,如果你是做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 这门框架,以后做物联网,智能家居,等等高薪技术都会用到这门框架。
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值