Alpine Docker中protobuf生成PHP元数据类格式异常如何修复
问题根因
- 你在Alpine中源码编译protobuf 3.19.4时,未开启PHP代码生成的十六进制输出编译开关,默认配置下protoc会直接将原始二进制字符串嵌入生成的PHP代码,也就是你看到的乱码内容。Ubuntu软件源分发的protoc二进制默认开启了该开关,因此会生成
hex2bin()包裹的标准十六进制串。 - 存在版本冲突风险:RoadRunner的
rr get-protoc-binary命令会自动拉取预编译的protoc二进制到当前工作目录,如果自行编译安装的protoc路径优先级低于该目录,编译proto时会调用到rr拉取的二进制,该二进制为glibc编译版本,和Alpine的musl libc存在兼容性问题,也会导致输出格式异常。
修复方案
- 调整protobuf编译参数,重新编译安装
解压protobuf源码后,执行configure时增加--enable-php-hex参数,替换原Dockerfile中的protobuf安装步骤为以下内容:
ENV PROTOBUF_VERSION 3.19.4 ENV PROTOBUF_URL https://github.com/google/protobuf/releases/download/v"$PROTOBUF_VERSION"/protobuf-cpp-"$PROTOBUF_VERSION".zip RUN curl -L -o protobuf.zip "$PROTOBUF_URL" \ && unzip protobuf.zip \ && cd protobuf-"$PROTOBUF_VERSION" \ && ./configure --enable-php-hex \ && make -j$(nproc) \ && make install \ && ldconfig /usr/local/lib \ && cd .. \ && rm -rf protobuf.zip protobuf-"$PROTOBUF_VERSION"
- 排除多版本protoc冲突
执行proto编译前,先删除当前工作目录下rr自动下载的protoc二进制文件,执行which protoc和protoc --version校验,确认当前调用的是/usr/local下自行编译安装的3.19.4版本,再执行编译命令。 - 结果校验
编写简单的测试proto文件执行生成,确认生成的PHP代码中internalAddGeneratedFile方法传入的是hex2bin()包裹的十六进制字符串,即为修复成功。
内容的提问来源于stack exchange,提问作者Evgeniy
相关产品推荐
相关产品推荐

