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中二进制的难点在于如何使用pack和unpack函数,用法可以参考手册,使用这两个函数时需要考虑字节序使用哪种字节序,要求服务端和客户端都使用同一种字节序打包解包。 http://php.net/manual/zh/function.pack.php http://php.net/manual/zh/function.unpack.php
以上是PHP二进制打包解包的例子,代码见https://github.com/walkor/workerman/blob/master/applications/Statistics/Bootstrap/StatisticWorker.php#L283
其他语言的二进制打包函数或者方法可能有所不同,具体参考所使用语言对应的手册,但是原理及传输的数据都是通用的
workerman只管传输数据,传输的具体协议或者格式workerman并不关心,workerman统一当做连续的字节流处理。
所以workerman不区分传输的是二进制还是非二进制,只有应用开发者才需要关心具体传输的数据是什么。
php中二进制一般采用pack打包,unpack解包。打包解包的内容一般只限于数字类型,字符串是不用打包的,可以直接传递。
发一个workerman中统计模块二进制打包的例子:
这个是包的结构体
PHP中二进制的难点在于如何使用pack和unpack函数,用法可以参考手册,使用这两个函数时需要考虑字节序使用哪种字节序,要求服务端和客户端都使用同一种字节序打包解包。
http://php.net/manual/zh/function.pack.php
http://php.net/manual/zh/function.unpack.php
以上是PHP二进制打包解包的例子,代码见https://github.com/walkor/workerman/blob/master/applications/Statistics/Bootstrap/StatisticWorker.php#L283
其他语言的二进制打包函数或者方法可能有所不同,具体参考所使用语言对应的手册,但是原理及传输的数据都是通用的