文档章节

Swoole大数据量传输解决方案

sharpcx
 sharpcx
发布于 05/18 18:18
字数 515
阅读 496
收藏 5

Swoole大数据量传输解决方案

问题:要不压缩的情况下,在Swoole TCP中传输大量数据length>1M
首先用node的mockjs生成一个大于1M的文件

	var jsonfile = require('jsonfile')
	var file = './data.json'
	let fs = require("fs");
	var Mock = require('mockjs')
	
	function injectContentTofileUntil(fileSizeInMega) {
	    let obj = jsonfile.readFileSync(file)
	    console.log(obj)
	    if(!obj){
	        obj=[]
	    }
	
	    for (let index = 0; index < 1000; index++) {
	        obj.push({
	            name: Mock.Random.cname(),
	            country: Mock.Random.county(true),
	        })
	    }
	
	    jsonfile.writeFileSync(file, obj)
	    let fileSizeInMegabytes = getFileSizeInMega(file)
	    if (fileSizeInMegabytes >= fileSizeInMega) {
	        return true
	    } else {
	        return false
	    }
	}
	
	function getFileSizeInMega(filePath) {
	    let stats = fs.statSync(file)
	    let fileSizeInBytes = stats.size
	    let fileSizeInMegabytes = fileSizeInBytes / 1000000.0
	    return fileSizeInMegabytes
	}
	
	while (!injectContentTofileUntil(1)) {
	    console.log(getFileSizeInMega(file));
	}

该文件为大于1M的无序文件,在不使用压缩的情况下传输该文件到server端。

1.正常起server和client传输

Server.php

	error_reporting(0);
	$client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);
	$filePath = realpath(__DIR__ . '/./jstools/data.json');
	$fileContent = file_get_contents($filePath);
	
	$client->on("connect", function ($cli) {
	    global $fileContent;
	    $cli->send($fileContent);
	});
	$client->on("receive", function ($cli, $data) {
	    echo "received: {$data}\n";
	});
	$client->on("error", function ($cli) {
	    echo "connect failed\n";
	});
	$client->on("close", function ($cli) {
	    echo "connection close\n";
	});
	$client->connect("127.0.0.1", 8091, 0.5);

Client.php

	$server = new swoole_server("0.0.0.0", 8081);
	$server->on('connect', function ($server, $fd){
	    echo "connection open: {$fd}\n";
	});
	$server->on('receive', function ($server, $fd, $reactor_id, $data) {
	    echo "received:" . $data;
	    $server->close($fd);
	    file_put_contents('./response.json', $data);
	});
	$server->on('close', function ($server, $fd) {
	    echo "connection close: {$fd}\n";
	});
	$server->start();

执行命令
php server.php
php client.php
报错:
WARNING swReactor_write (ERROR 1201): data is too large, cannot exceed buffer size.
原因:
buffer不足溢出

2.修改buffer不足问题

设置client最大buffer:
"socketbuffersize"=>210241024,

报错:
2018-05-18 17:46:09 *6146.0 ERROR swWorker_discard_data (ERROR 1007): 1received the wrong data8180 bytes from socket#1

原因:
当swoole接收到满足buffer大小的内容时会自动结束传输,已经把数据给消费者,但是数据并没有传输完成,此时有几种方案解决该问题:

  • 1.压缩
  • 2.告诉swoole到达buffer大小时还没传输结束,本文只讨论此方案

3.实现数据传输切分

server设置:

	'package_eof' => "\r\n\r\n",
	'open_eof_split' => true,

client设置:

	'package_eof' => "\r\n\r\n",

可以正常传输。

4.此方案优缺点:

优点:可以正常传输任意大小数据
缺点:需要手动给流增加eof
字段含义请自行查阅swoole文档。

代码地址:https://gitee.com/sharpcx/swoole_big_str

© 著作权归作者所有

共有 人打赏支持
sharpcx
粉丝 3
博文 5
码字总数 2748
作品 0
海淀
程序员
私信 提问
swoole项目思维转换 -- mysql server gone away

mysql做为php的黄金搭档和互联网上应用最广泛的数据库,免不了天天与之打交道,不少朋友在熟悉swoole的使用之后,也趟平了不少坑,准备实战了,终于上线了,正愉快的体验swoole带来的巨大改进...

杨太化
2015/10/15
182
0
Swoole Framework - SOA实现

Swoole Framework - SOA 最近由于业务关系某些模块需要分类,在此之前考虑过使用鸟哥的Yar,好处是在写服务端的同时,所做的注释可以在直接访问时,直接已文档形式呈现,而且在windows与Lin...

太阳黑子
2016/10/30
89
0
PHP纯异步非阻塞框架--swPromise

swPromise 是基于 swoole 的 PHP promise 框架。 在日常的使用场景中,PHP一般用作接口聚合层。一个业务请求可能会串行的请求多个接口A->B->C,此时如果接口B的响应时间较慢(关键性业务,需...

coooold
2015/11/18
1K
0
第二章: TCP服务器端/客户端的开发

推荐 swoole ide:https://github.com/eaglewu/swoole-ide-helper 下载放在项目目录 Swoole 在IDE下自动识别类、函数、宏,自动补全函数名 Swoole 结构,便于开发过程中查看文档,以及屏蔽I...

Muggle001
2016/07/26
121
0
基于 Swoole 的内网穿透 - YurunProxy

首先感谢 Swoole 为我们广大 phper 带来第二春,可以非常方便地开发各种网络通信应用! YurunProxy 是基于 Swoole 的内网穿透,支持本地微信开发、Web开发,让外网能够访问到! 这是宇润这周...

宇润
02/11
1
0

没有更多内容

加载失败,请刷新页面

加载更多

当S8遇上边缘计算:谈阿里云ENS对直播业务场景的支撑

摘要: 类似S8赛事这样的大型活动直播的特点和技术挑战是什么?为什么业务要下沉到边缘?自建边缘节点和与云服务厂商合作到底该如何选择?边缘节点服务(ENS)又是如何进行技术支撑?提供的针...

阿里云官方博客
6分钟前
1
0
supervisor安装配置

supervisor安装配置 安装 wget -c https://files.pythonhosted.org/packages/44/60/698e54b4a4a9b956b2d709b4b7b676119c833d811d53ee2500f1b5e96dc3/supervisor-3.3.4.tar.gztar -zxvf su......

jackmanwu
16分钟前
1
0
laravel定时器

民间高手: https://blog.csdn.net/zhezhebie/article/details/79205414 官方文档: https://laravel-china.org/docs/laravel/5.5/scheduling/1325...

vio小黑
39分钟前
0
0
Apache Zeppelin安装及使用

Apache Zeppelin官网:http://zeppelin.apache.org/ Apache Zeppelin介绍:A web-based notebook that enables interactive data analytics. You can make beautiful data-driven, interacti......

GordonNemo
40分钟前
4
0
关于python开发多个项目环境配置Anaconda

关于Anaconda用来管理Python的包和环境 下载并安装Anaconda 创建项目:windows键+R ==> 进入CMD => 输入conda create -n 项目名称 python=3 conda info -e 查看项目以及项目所在的位置,默认...

上官清偌
42分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部