php出现zend_mm_heap corrupted 或者Segment fault

目录

一、背景

二、原因

三、解决方法


一、背景

使用php+zmq实现前后端通信,出现只能发布、请求数据,不能订阅到消息及接收请求回复的消息

这是订阅端$connectAddr = 'tcp://127.0.0.1:5566';,负责发布消息

这是接收端,负责订阅消息

二、原因

ZMQ 字符串缓冲区与 Zend MM 内存布局冲突(嵌入式 PHP 8.0 NTS 专属)。接收 1 条消息后必触发 zend_mm_heap corrupted,说明 ZMQ 1.1.3 的字符串缓冲区释放逻辑与 PHP 8.0 NTS 的 Zend MM 内存布局存在底层不兼容------ 即使做了字符串复制和延迟,ZMQ 释放缓冲区时仍会意外触碰 Zend MM 管理的内存区域(嵌入式环境内存地址更紧凑,冲突概率极高)。出现Segment fault 修改代码排查也是由于zend_mm_heap corrupted 引起,也会造成只收到一条数据就发生错误。

三、解决方法

升级PHP-ZMQ 1.2.0 或者在控制端输入命令行执行export USE_ZEND_ALLOC=0,然后在运行php zmq_subscriber.php即可(临时生效)

ps:不用USE_ZEND_ALLOC性能会急剧下降,这是php自带的内存管理机制,作用是禁用 PHP 底层 Zend 引擎的内置内存分配器(Zend Memory Manager,ZMM)

但该方法重启后失效,需要写入开机自启动,导出该环境变量,在嵌入式linux中/etc/profile加入即可。

重启成功运行

相关推荐
eqwaak02 分钟前
PyTorch入门:10分钟搭建首个神经网络
开发语言·人工智能·pytorch·python
雪碧聊技术4 分钟前
上午题_计算机系统
java·开发语言
纤纡.5 分钟前
解锁 Python 实用编程技巧:线程、视觉识别、正则匹配与装饰器实战
开发语言·python·深度学习·opencv
国科安芯9 分钟前
航空安全关键系统抗辐射 MCU 加固技术、工程实现与典型应用
单片机·嵌入式硬件·无人机·cocos2d·risc-v
t***54410 分钟前
如何在Dev-C++中配置Clang编译器
开发语言·c++
逆境不可逃11 分钟前
一篇速通RabbitMQ (从入门到生产实战:核心原理、高级特性与 Spring Boot 集成全解)
开发语言·后端·ruby
yuanpan14 分钟前
Python Pandas 库入门:介绍与基本使用教程
开发语言·python·pandas
t***54417 分钟前
Dev-C++ 中使用 Clang 调试有哪些常见问题
开发语言·c++
遇见你的雩风21 分钟前
Java --- 网络原理(三)
java·开发语言·网络
会编程的土豆22 分钟前
Go语言零基础入门:从0到能写程序(超详细版)
开发语言·后端·golang