在最新的4.5.6开发分支中,底层增加了2个特殊的函数:
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);

Swoole 4.5.6版本引入了新的底层函数,针对JSON和PHP序列化的场景优化,减少内存拷贝以提高性能。在压测中,相较于传统方法,使用新函数性能提升了显著的百分比。这对于处理大量数据的PHP应用,尤其是在高并发环境下,能够带来显著的效率提升。
最低0.47元/天 解锁文章
223





