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加入即可。

重启成功运行

相关推荐
破茧蝴蝶7 小时前
Python分布式爬虫完整教程
开发语言·python
狗凯之家源码网7 小时前
全新 PHP 轻量客服聊天室源码深度评测
开发语言·php·聊天室系统
国科安芯8 小时前
立方星与微纳卫星综合电子微型化趋势下的抗辐射MCU选型综述
人工智能·单片机·嵌入式硬件·mcu·risc-v·抗辐射
xunyan62348 小时前
3-1 独立按键控制LED亮灭(SDCC + Notepad++ + STC-ISP/普中ISP)
单片机·嵌入式硬件·接口隔离原则
远离UE48 小时前
UE5 Substrate Thin Film 源码拆析
开发语言·javascript·ue5
keyipatience8 小时前
JavaScript学习(1)书写位置,变量、数据类型、运算符
开发语言·前端·javascript·css·学习
WD137298015578 小时前
WD5030L,为充电桩、工业设备、5G 基站、车载系统、消费电子提供电源,7-30V 的宽压输入
stm32·单片机·嵌入式硬件·5g·车载系统·51单片机
栈帧之外9 小时前
【C++】STL之set
开发语言·c++
catchadmin9 小时前
免费可商用 PHP 管理后台 CatchAdmin V5.4.1 发布,新增 MCP 支持
开发语言·php
创界工坊工作室10 小时前
30-基于STM32的小麦烘干塔温度控制系统设计
stm32·单片机·嵌入式硬件·proteus