php读取ubjson需用ubjson扩展或vladislav-sevruk/ubjson库,不可用json_decode()或unserialize();写入时须注意类型严格性、二进制安全及编码模式,推荐仅在带宽敏感场景(如iot)中使用。

PHP怎么读取UBJSON数据
PHP标准库不支持UBJSON,必须用第三方扩展或纯PHP解析器。最可靠的是 ubjson 扩展(基于C,性能好),但需手动编译安装;若无法装扩展,可用 php-ubjson 这类纯PHP库(如 vladislav-sevruk/ubjson Composer包)。
常见错误现象:json_decode() 直接读UBJSON二进制会返回 null,且无报错;file_get_contents() 读出的字节流若直接传给 unserialize() 也会失败——UBJSON不是JSON也不是PHP序列化格式。
- 用扩展方式:先运行
pecl install ubjson,启用extension=ubjson.so,再调用ubjson_decode($binary_data) - 用Composer方式:执行
composer require vladislav-sevruk/ubjson,然后$data = \Ubjson\Ubjson::decode($binary_data) - 注意输入必须是原始二进制(不能是UTF-8转义过的字符串),
file_get_contents('data.ubj')的结果可直接传入
PHP怎么写入UBJSON数据
写入比读取更容易出兼容性问题:不同库对浮点精度、整数溢出、空值(null vs nil)和容器类型(如 map vs array)的处理不一致。官方UBJSON规范要求严格区分类型标记,PHP数组本身无类型信息,所以必须显式控制结构。
使用场景包括向嵌入式设备发送紧凑配置、与Rust/Go服务交换高性能二进制数据。若目标端要求 strict mode(如强制 map 键为字符串),PHP侧就不能传入数字键的关联数组。
- 扩展方式:用
ubjson_encode($data, UBJSON_ENCODING_PRETTY)可加可读性格式,但生产环境建议用默认 compact 模式 - 纯PHP库:调用
\Ubjson\Ubjson::encode($data, ['strict_types' => true])能避免自动类型提升(例如把127当作uint8而非int32) - 特别注意:PHP的
float默认按 double 编码,若需 float32,得先用pack('G', $f)提取4字节再手动构造 UBJSON 值(多数库不支持)
UBJSON在PHP里容易踩的坑
最常被忽略的是字符编码和二进制安全。UBJSON是二进制协议,所有字符串默认为 UTF-8 字节流,但 PHP 的 mb_convert_encoding() 或 iconv() 若误操作会破坏长度标记(UBJSON中字符串前有 length:int32),导致后续解析全乱。
-
fopen()必须用'rb'模式读,'wb'模式写,否则Windows下可能插入\r\n - PHP 8.1+ 的
JsonException不适用于UBJSON,错误只能靠try/catch捕获扩展抛出的UbjsonException或检查返回值是否为false - 大数组嵌套深度超过默认
xdebug.max_nesting_level时,纯PHP解析器可能爆栈,而C扩展不受此限 - 时间类型(如
datetime)不是UBJSON原生类型,需提前转成ISO8601字符串或Unix timestamp整数
要不要在PHP项目里用UBJSON
除非你明确需要比JSON小30%~50%的体积、确定上下游都支持UBJSON、且传输频繁到带宽或解析耗时成为瓶颈,否则不建议引入。PHP生态里JSON扩展已深度优化,json_encode() 在PHP 8.0+ 中甚至快过多数UBJSON实现。
更现实的选择是:只在特定模块(如IoT网关层)用UBJSON,其他业务层仍走JSON;或者用 msgpack(PHP原生支持,社区成熟,工具链全),它和UBJSON定位相似但落地更稳。
复杂点在于类型映射——比如PHP的 resource、closure、object(未实现 JsonSerializable)都无法直通UBJSON,必须提前规约成数组/标量,这点比JSON更苛刻。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











