1. php的二进制安全 binary-safephp的内部函数在操作二进制数据时能保证达到预期的结果,例如 str_replace、stristr、strcmp 等函数,我们就说这些函数是二进制安全的。
下面通过 c 语言 和 php 的对比 来看 他们对二进制数据的处理#include stdio.h#include string.hint main(){char a[] = aa\0b;char b[] = aa\0c;printf(%d\n, strcmp(a, b));printf(%ld\n, strlen(a));
}/* 0 2 */
可以看出来 c语言 \0 是字符串结束,所以认为 aa\0b' 和 aa\0c 是一样的,长度为2 抛弃了 \0b 和 \0c .
php aa\0b 和 aa\0c 是不同的 ,并且长度为42. php实现二进制安全的原理php中字符串通过 zend_string 表示:
php中 变量 zend_value 表示:
gc: 变量引用信息,比如当前value的引用数,所有用到引用计数的变量类型都会有这个结构,3.1节会详细分析
h: 哈希值,数组中计算索引时会用到
len: 字符串长度,通过这个值保证二进制安全
val: 字符串内容,变长struct,分配时按len长度申请内存
len: 字符串长度,通过这个值保证二进制安全 ,它不需要像c 一样用哟 ‘\0’ 结尾符来判断字符串的结束,而是通过len
3.sdsc : 以 ’\0’ 为结束符,所以c的字符串不能包含文本,图片、音频、视频、压缩文件这样的二进制数据。
php : 记录 len
sds : simple dynamic string 简单动态字符串的抽象类型,应用到字符表示:
sds 数据结构:
struct sdshdr { # 记录 buf 数组中已使用字节的数量
# 等于 sds 所保存字符串的长度
int len; # 记录 buf 数组中未使用字节的数量
int free; # 字节数组,用于保存字符串
char buf[];
};
redis 的结构定义中也记录了sds所保存字符串的长度,通过这个值保证二进制安全,sds 的 api 都会用 字符串的len 属性来判断字符串是否结束。
相关推荐:
php二进制安全的含义
php的二进制安全_php教程
php函数二进制安全有关问题
以上就是php关于二进制安全详解的详细内容。