在最新的4.5.6开发分支中,在底层增加了两个特殊函数:swoole_substr_json_decodeswoole_substr_unserialize为什么要在这里增加这两个函数呢?有这么一幕。使用Swoole\Server实现RPC服务。在EOF协议或长度协议的通信方式中,一个数据包可能由3部分组成。$packet=$header+$body+$footer通常$header和$footer比较小,而$body比较大,$body可能使用JSON或者PHP序列化格式。如果要解析$body数据,需要先进行substr得到$body的字符串格式数据,再进行json_decode和unserialize操作。这将导致内存复制。$body_str=substr($packet,$header_length)的过程会创建一个临时字符串变量,在反序列化操作$body=json_decode($body_str)后释放。//先执行substr,然后会产生一个内存拷贝,从$packet拷贝数据到$body_str$body_str=substr($packet,4,strlen($packet)-4-2);//$body_str反序列化后这个一块内存不再使用,函数退出时将被释放。$body=json_decode($body_str,true);使用这两个新函数,可以将substr和反序列化操作合二为一。减少一个内存副本,从而提高性能。$body=swoole_substr_json_decode($packet,$header_length);$body=swoole_substr_unserialize($packet,$header_length);压测
