补充一下 PHP 的基础知识,什么是二进制安全?
这得从 C 语言说起。
C字符串中的字符必须符合某种编码( 比如 ASCII), 并且除了字符串的末尾之外, 字符串里面不能包含空字符, 否则最先被程序读入的空字符将被误认为是字符串结尾, 这些限制使得 C 字符串只能保存文本数据, 而不能保存像图片、 音频、 视频、 压缩文件这样的二进制数据。
以上这段文字摘自《Redis设计与实现》。
举个例子,如果一个字符串包含 C 语言中表示结束的 ‘\0’, 如字符串:Redis\0Cluster\0,这个时候会误以为在第一个”\0″处字符串结束了,这也是非二进制安全的。
PHP 二进制安全简单说就是传入的参数支持二进制数据,包括”\0″这种在 C 中表示字符串结束的字符,如 strlen 函数,可以传入 strlen(‘Redis\0Cluster\0’) 这种参数。
再如 PHP 中的 strcoll 和 strcmp 函数:
$string1 = "Hello";
$string2 = "Hello\x00Hello";
echo strcoll($string1, $string2); // 返回0, 由于是非二进制安全,误判为相等
echo strcmp($string1, $string2); // 返回负数
他们分别用于非二进制安全和二进制安全的情况。因此很多函数会表明是否是二进制安全的,要注意在正确的场景下使用。
(责任编辑:最模板) |