php 解包二进制,workerman的二进制怎么玩啊,怎么封包,怎么解包啊

workerman只管传输数据,传输的具体协议或者格式workerman并不关心,workerman统一当做连续的字节流处理。

所以workerman不区分传输的是二进制还是非二进制,只有应用开发者才需要关心具体传输的数据是什么。

php中二进制一般采用pack打包,unpack解包。打包解包的内容一般只限于数字类型,字符串是不用打包的,可以直接传递。

发一个workerman中统计模块二进制打包的例子:

这个是包的结构体

struct statisticPortocol

{

unsigned char module_name_len; //模块名长度

unsigned char interface_name_len;// 接口名长度

float cost_time; // 本次接口耗时

unsigned char success; // 本次接口调用是否成功

int code; // 返回码

unsigned short msg_len; // 错误信息长度

unsigned int time; // 时间戳

char module_name; // 具体的模块名

char interface_name; // 具体的接口名

char msg; // 具体的错误信息

}

// PHP中打包

$module = ‘User’;

$interface = 'getInfo';

$cost_time = 0.001;

$success = 0;

$code = 500;

$msg = '数据库无法连接';

$module_name_length = strlen($module);

$interface_name_length = strlen($interface);

// 打包,只有数字类的才需要pack打包,字符串直接拼接即可

$bin_data = pack('CCfCNnN', $module_name_length, $interface_name_length, $cost_time, $success ? 1 : 0, $code, strlen($msg), time()).$module.$interface.$msg

// PHP中解包

$data = unpack("Cmodule_name_len/Cinterface_name_len/fcost_time/Csuccess/Ncode/nmsg_len/Ntime", $bin_data);

// 17是statisticPortocol前8个字段的固定占用字节长度

$module = substr($bin_data, 17, $data);

$interface = substr($bin_data, 17 + $data, $data);

$msg = substr($bin_data, 17 + $data + $data);

$data = array(

'module' => $module,

'interface' => $interface,

'cost_time' => $data,

'success' => $data,

'time' => $data,

'code' => $data,

'msg' => $msg,

);

以上是PHP二进制打包解包的例子,代码见https://github.com/walkor/workerman/blob/master/applications/Statistics/Bootstrap/StatisticWorker.php#L283

其他语言的二进制打包函数或者方法可能有所不同,具体参考所使用语言对应的手册,但是原理及传输的数据都是通用的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值