grandt/binstring

用于绕过mbstring.func_override使用的类

1.0.0 2015-08-13 06:14 UTC

This package is not auto-updated.

Last update: 2024-09-14 16:13:35 UTC


README

如果你使用PHP的mbstring.func_overload,或者你运行的服务器已经启用了它,那么你可能会遇到麻烦。尤其是如果你依赖解析二进制数据和协议的能力。

介绍

关于“我应该使用多字节重载(mbstring.func_overload)吗?”的问题。用户'gphilip'在这个StackOverflow帖子中回答得很好:http://stackoverflow.com/questions/222630/should-i-use-multi-byte-overloading-mbstring-func-overload

我的回答是:绝对不行!

问题在于,一旦str*函数被重载,就没有简单的方法来“重置”它们。

在一段时间内,这可能对你的项目工作得很好,但你几乎肯定会遇到一个外部库,它使用字符串函数来实现二进制协议,然后它们会失败。它们会失败,你将花费数小时试图找出为什么它们会失败。

描述

当mbstring.func_overload被启用时,这个类是对字符串函数的包装。请注意,只有在你必须的时候才使用这个类,因为它确实会影响性能,尽管这主要是因为mb_string的问题,而不是这个类。PHP中的函数调用本身就相当昂贵,如果启用了func_overload,它将只使用mb_string函数来代替内置的PHP字符串,将它们解析为'latin1',这在CPU方面也很昂贵。

为什么会有潜在的性能影响?

PHP,就像Java一样,有长度感知的字符串,这意味着对象头知道你的字符串有多长。它们是二进制安全的,并且不以null(0x00)终止。

mb_string函数忽略了这一点,并解析整个字符串,以确定是什么。strlen(string)只是告诉你它包含多少字节,mb_strlen会解析它,以找到多字节字符,并告诉你有多少个字符。这对于正确处理多字节编码的字符串(如UTF-8)来说很好,但在处理二进制数据时很糟糕,因为多字节序列很可能随机地出现在任何足够大的二进制数据集中。