当前位置: 首页 > article >正文

将PHP C++扩展从php5升级到php7

将PHP C扩展从php5升级到php7在没有怎么看明白php5 php7源码的情况下接手一份基于php5写c扩展如何接手快速升级到php7环境下也能使用呢我仅仅修改了所引用的一个php中对象处理的头文件就满足了要求扩展被编译通过运行正常。phpobj.h 文件定义版本选择#ifndef _PHP_OBJ_H_2017 #define _PHP_OBJ_H_2017 #include php_version.h #if PHP_MAJOR_VERSION 7 #include php5obj.h #else #include php7obj.h #endif #endif//_PHP_OBJ_H_2017php5obj.h 旧的#define SW_RETURN_STRINGL RETURN_STRINGL #define SW_RETVAL_STRINGL RETVAL_STRING #define SW_RETVAL_STRING RETVAL_STRING #define SW_RETURN_STRING RETURN_STRING #define SW_ZVAL_STRINGL ZVAL_STRINGL #define SW_ZVAL_STRING ZVAL_STRING #define SW_MAKE_STD_ZVAL(p) MAKE_STD_ZVAL(p) #define PZVAL_IS_REF(len) ZVAL_IS_REF(len) // Register the class entry.. #define PHP5CPP_REGISTER_CLASS(name, obj_name) / { / zend_class_entry ce; / INIT_CLASS_ENTRY(ce, obj_name, php5cpp_ ## name ##_methods); / ce.create_object php5cpp_object_new_ ## name; / php5cpp_ce_ ## name zend_register_internal_class_ex(ce, NULL, NULL TSRMLS_CC); / memcpy( php5cpp_object_handlers_ ## name, / zend_get_std_object_handlers(), / sizeof(zend_object_handlers) ); / php5cpp_object_handlers_ ## name.clone_obj NULL; / php5cpp_ce_ ## name-ce_flags | ZEND_ACC_FINAL_CLASS; / } #define PHP5CPP_GET_THIS() / zval* object getThis(); // Register resources. If were using an object, put it into the object store. #define PHP5CPP_REGISTER_RESOURCE(obj_type, return_value, res, le) / { / PHP5CPP_GET_THIS(); / int rsrc_id ZEND_REGISTER_RESOURCE(object ? NULL : return_value, res, le); / if (object) { / php5cpp_obj *obj (php5cpp_obj *)zend_object_store_get_object(object TSRMLS_CC); / obj-u.obj_type res; / obj-rsrc_id rsrc_id; / obj-type is_ ## obj_type; / } / } // These are for parsing parameters and getting the actual object from the store. #define PHP5CPP_SET_OBJ(type) / { / php5cpp_obj *obj (php5cpp_obj *)zend_object_store_get_object( object TSRMLS_CC ); / type ## _instance obj-u.type; / } // Deprecated #define PHP5CPP_OBJ_PARAMS(type, params) / { / PHP5CPP_GET_THIS(); / if (object) { / if (params FAILURE) { / RETURN_FALSE; / } / PHP5CPP_SET_OBJ(type) / } / } // Deprecated #define PHP5CPP_OBJ_NO_PARAMS(type) / { / PHP5CPP_GET_THIS(); / if (object) { / if (ZEND_NUM_ARGS() ! 0) { / php_error(E_WARNING, didnt expect any arguments in %s(), get_active_function_name(TSRMLS_C)); / } / PHP5CPP_SET_OBJ(type) / } / } #define PHP5CPP_GET_OBJ(type) / { / PHP5CPP_GET_THIS(); / if (object) { / PHP5CPP_SET_OBJ(type) / } / if (type ## _instance NULL) { / php_error(E_WARNING, Get object fall in %s(), get_active_function_name(TSRMLS_C)); / } / } #define PHP5CPP_GET_OBJ_ZVAL(type, obj) / { / zval* object obj; / if (object) { / PHP5CPP_SET_OBJ(type) / } / if (type ## _instance NULL) { / php_error(E_WARNING, Get object fall in %s(), get_active_function_name(TSRMLS_C)); / } / } //static void php5cpp_object_free_storage_ ## type(zend_object *object TSRMLS_DC) #define PHP5CPP_OBJ_FREE_FUNCTION(type) / static void php5cpp_object_free_storage_ ## type(void *object TSRMLS_DC) / { / php5cpp_obj *obj (php5cpp_obj *) object; / zend_hash_destroy(obj-std.properties); / FREE_HASHTABLE(obj-std.properties); / if ( obj-u.type ) { / zend_list_delete(obj-rsrc_id); / } / efree(obj); / } #define PHP5CPP_OBJ_NEW_FUNCTION(type) / static zend_object_value php5cpp_object_new_ ## type(zend_class_entry *class_type TSRMLS_DC) / { / zend_object_value retval; / zval *tmp; / php5cpp_obj *obj (php5cpp_obj *)emalloc( sizeof(php5cpp_obj) ); / memset( obj, 0, sizeof(php5cpp_obj) ); / obj-std.ce class_type; / ALLOC_HASHTABLE( obj-std.properties ); / zend_hash_init( obj-std.properties, 0, NULL, ZVAL_PTR_DTOR, 0 ); / zend_hash_copy( obj-std.properties, / class_type-properties_info, / (copy_ctor_func_t) zval_add_ref, / (void *) tmp, / sizeof(zval *) ); / retval.handle zend_objects_store_put( obj, / NULL, / (zend_objects_free_object_storage_t)php5cpp_object_free_storage_ ## type, / NULL TSRMLS_CC ); / retval.handlers php5cpp_object_handlers_ ## type; / return retval; / } #endifphp7obj.h 新的#define SW_RETURN_STRINGL(s, l, dup) RETURN_STRINGL(s, l) #define SW_RETVAL_STRINGL(s, l, dup) do{RETVAL_STRINGL(s, l); if (dup 0) efree(s);}while(0) #define SW_RETVAL_STRING(s, dup) do{RETVAL_STRING(s); if (dup 0) efree(s);}while(0) #define SW_RETURN_STRING(val, duplicate) RETURN_STRING(val) #define SW_ZVAL_STRINGL(z, s, l, dup) ZVAL_STRINGL(z, s, l) #define SW_ZVAL_STRING(z,s,dup) ZVAL_STRING(z,s) #define SW_MAKE_STD_ZVAL(p) zval _stack_zval_##p; p (_stack_zval_##p) #define PZVAL_IS_REF(len) 0 static inline php5cpp_obj* php5obj_from_obj(zend_object *obj) { return (php5cpp_obj*)((char*)(obj) - XtOffsetOf(php5cpp_obj, std)); } #define Z_PHP5OBJ_P(zv) php5obj_from_obj(Z_OBJ_P((zv))) // Register the class entry.. #define PHP5CPP_REGISTER_CLASS(name, obj_name)/ {/ zend_class_entry ce;/ INIT_CLASS_ENTRY(ce, obj_name, php5cpp_##name##_methods);/ ce.create_object php5cpp_object_new_##name; / php5cpp_ce_##name zend_register_internal_class_ex(ce, NULL); / memcpy( php5cpp_object_handlers_##name, zend_get_std_object_handlers(),sizeof(zend_object_handlers) );/ php5cpp_object_handlers_##name.clone_obj NULL;/ } //#define ZEND_REGISTER_RESOURCE(return_value, result, le_result) ZVAL_RES(return_value,zend_register_resource(result, le_result)) #define PHP5CPP_GET_THIS() / zval* object getThis(); // Register resources. If were using an object, put it into the object store. #define PHP5CPP_REGISTER_RESOURCE(obj_type, return_value, res, le) / {/ PHP5CPP_GET_THIS();/ int rsrc_id 0;/ /*zend_register_resource(res,le);*// if (object) { / php5cpp_obj *obj Z_PHP5OBJ_P(object);/ obj-u.obj_type res;/ obj-rsrc_id rsrc_id;/ obj-type is_##obj_type;/ }/ } // These are for parsing parameters and getting the actual object from the store. #define PHP5CPP_SET_OBJ(type_name) / { / php5cpp_obj *obj Z_PHP5OBJ_P(object) ; / type_name ## _instance obj-u.type_name;/ } // Deprecated #define PHP5CPP_OBJ_PARAMS(type, params) / { / PHP5CPP_GET_THIS(); / if (object) { / if (params FAILURE) { / RETURN_FALSE; / } / PHP5CPP_SET_OBJ(type) / } / } // Deprecated #define PHP5CPP_OBJ_NO_PARAMS(type) / { / PHP5CPP_GET_THIS(); / if (object) { / if (ZEND_NUM_ARGS() ! 0) { / php_error(E_WARNING, didnt expect any arguments in %s(), get_active_function_name(TSRMLS_C)); / } / PHP5CPP_SET_OBJ(type) / } / } #define PHP5CPP_GET_OBJ(type) / {/ PHP5CPP_GET_THIS();/ PHP5CPP_SET_OBJ(type);/ } #define PHP5CPP_GET_OBJ_ZVAL(type, obj) / { / zval* object obj; / if (object) { / PHP5CPP_SET_OBJ(type) / } / if (type ## _instance NULL) { / php_error(E_WARNING, Get object_zal fall in %s(), get_active_function_name(TSRMLS_C)); / } / } #define PHP5CPP_OBJ_FREE_FUNCTION(type) / static void php5cpp_object_free_storage_ ## type(void *object TSRMLS_DC) / {/ php5cpp_obj *obj Z_PHP5OBJ_P((zval *)object);/ zend_object_std_dtor(obj-std);/ } #define PHP5CPP_OBJ_NEW_FUNCTION(type) / static zend_object* php5cpp_object_new_ ## type(zend_class_entry *class_type TSRMLS_DC) / {/ int objsize sizeof(php5cpp_obj);/ php5cpp_obj *obj(php5cpp_obj*)ecalloc(1,objsize);memset(obj,0,objsize);/ php_error(E_WARNING, create object %p in %s(),obj,get_active_function_name(TSRMLS_C));/ zend_object_std_init(obj-std, class_type TSRMLS_CC);object_properties_init(obj-std, class_type);/ obj-std.handlers php5cpp_object_handlers_##type;/ return obj-std;/ } #endif//_PHP7OBJ_H_《网络安全从零到精通全套学习大礼包》96节从入门到精通的全套视频教程免费领取如果你也想通过学网络安全技术去帮助就业和转行我可以把我自己亲自录制的96节 从零基础到精通的视频教程以及配套学习资料无偿分享给你。网络安全学习路线图想要学习 网络安全作为新手一定要先按照路线图学习方向不对努力白费。对于从来没有接触过网络安全的同学我帮大家准备了从零基础到精通学习成长路线图以及学习规划。可以说是最科学最系统的学习路线大家跟着这个路线图学习准没错。配套实战项目/源码所有视频教程所涉及的实战项目和项目源码学习电子书籍学习网络安全必看的书籍和文章的PDF市面上网络安全书籍确实太多了这些是我精选出来的面试真题/经验以上资料如何领取

相关文章:

将PHP C++扩展从php5升级到php7

将PHP C扩展从php5升级到php7 在没有怎么看明白php5 php7源码的情况下,接手一份基于php5写c扩展,如何接手快速升级到php7环境下也能使用呢;我仅仅修改了所引用的一个php中对象处理的头文件,就满足了要求,扩展被编译通过…...

别再手动配聚合了!用LACP协议给你的交换机链路做个‘智能冗余’(附华为交换机配置命令)

告别手动配置:LACP协议如何为你的企业网络打造智能冗余链路 想象一下这样的场景:凌晨三点,核心交换机之间的某条链路突然中断,整个企业的业务系统陷入瘫痪。运维团队手忙脚乱地排查故障,却发现由于手动配置的链路聚合缺…...

AI Agent Runtime 重构:会话即事件日志的工程实践

1. 这不是新赛道,是 runtime 层的“操作系统时刻”来了 你有没有试过让一个 AI 代理连续工作四十分钟?不是闲聊,而是真正在查资料、调 API、写代码、汇总报告——一个接一个步骤往下走。我去年就搭过这么一套系统,用的是当时最火的…...

MoE架构揭秘:逐Token路由与活跃参数量的工程真相

1. 项目概述:当“千亿参数”不再是个吓人的数字,而是一套精打细算的调度系统你肯定见过这类标题:“GPT-4拥有1.8万亿参数!”——第一反应是震撼,第二反应是疑惑:我的显卡连加载一个7B模型都得开量化&#x…...

Pixel 6有锁机保姆级解锁教程:从‘SIM卡不受支持’到完美VoLTE通话(附ADB/Shizuku工具包)

Pixel 6有锁机完全解锁指南:从网络锁到功能优化全攻略 前言 当你从二手市场淘到一台Pixel 6,满心欢喜地插入SIM卡准备使用时,屏幕上却赫然显示"SIM卡不受支持"——这种挫败感我深有体会。作为一款硬件配置出色的设备,Pi…...

高通8650 AudioReach实战:手把手调试GSL-Passthru-GPR数据流(附动态调试脚本)

高通8650 AudioReach实战:GSL-Passthru-GPR数据流调试全指南 当你在深夜的实验室里盯着示波器上那条毫无波动的音频信号线时,手机突然响起一阵刺耳的电流噪声——这可能是每位音频驱动工程师都经历过的噩梦时刻。高通AudioReach架构作为现代移动音频系统…...

机智云物联网边缘管理系统通过国产化硬件适配认证:实战解析边缘计算架构与生态价值

1. 项目概述:从“云端”到“边缘”,一次关键的认证意味着什么?最近,我们团队主导的“机智云物联网边缘管理系统”成功通过了某主流国产化硬件平台的适配认证。这个消息在内部技术群里传开时,很多同事的第一反应是&…...

AI 超声波口罩机智能功率 MOSFET 完整选型方案

随着 AI 视觉检测与自适应控制技术深度集成,现代超声波口罩机对功率 MOSFET 提出更高要求:高频谐振效率、低损耗长寿命、高可靠精密驱动。微碧半导体(VBsemi)基于先进 SGT 及 Trench 工艺,为您提供覆盖超声波发生器、传…...

STM32G474RB用CMSIS-DAP下载程序,遇到一堆content mismatch错误?别急着换芯片,先检查这个硬件细节

STM32G474RB用CMSIS-DAP下载程序遇到content mismatch?可能是多设备干扰惹的祸 当你在实验室同时调试多块STM32开发板时,是否遇到过这样的场景:昨天还能正常烧录的STM32G474RB板卡,今天突然开始报出一连串content mismatch错误&am…...

使用curl命令直接调试taotoken大模型api接口的详细方法

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用curl命令直接调试Taotoken大模型API接口的详细方法 对于需要在无SDK环境下进行底层调试、自动化脚本编写或快速验证接口的开发…...

别再让电池一天一充!用STM32F103的PWR模块,把你的物联网设备续航提升10倍

STM32F103极致低功耗实战:从芯片级优化到系统级策略 在智能家居传感器和便携式设备领域,电池续航能力直接决定了产品的用户体验和市场竞争力。我曾参与开发一款基于STM32F103的温湿度传感器,最初版本每天都需要充电,客户抱怨连连…...

API调用总失败?ChatGPT官方Rate Limit机制深度拆解,4类高频报错代码级诊断手册

更多请点击: https://kaifayun.com 第一章:API调用总失败?ChatGPT官方Rate Limit机制深度拆解,4类高频报错代码级诊断手册 ChatGPT API 的速率限制(Rate Limit)并非黑盒策略,而是由 OpenAI 明确…...

告别卡顿!Win11下用Process Lasso手动调度VMware虚拟机,榨干12/13代酷睿大小核性能

榨干12/13代酷睿潜力:Win11下VMware虚拟机性能调优实战指南 当你在Windows 11系统上运行VMware虚拟机时,是否遇到过这样的困扰:编译代码时进度条像蜗牛爬行,鼠标移动有明显的迟滞感,系统资源管理器显示CPU占用率并不高…...

最后37个可用的Lovable CRM私有化部署License名额:含2024最新GDPR+信创双合规配置包

更多请点击: https://kaifayun.com 第一章:Lovable CRM系统搭建 Lovable CRM 是一个轻量、可扩展、开发者友好的客户关系管理系统,专为中小团队设计,强调易用性与可定制性的平衡。它基于 Go 语言后端与 Vue 3 前端构建&#xff0…...

STM32F103C6T6模拟SPI驱动ADS1220:从硬件连接到代码调试的完整避坑指南

STM32F103C6T6模拟SPI驱动ADS1220:从硬件连接到代码调试的完整避坑指南 在嵌入式开发领域,高精度数据采集一直是工程师们面临的挑战之一。TI公司的ADS1220作为一款24位Δ-Σ模数转换器,以其出色的噪声性能和灵活的配置选项,成为许…...

如何用Python自动识别ElevenLabs输出语音是否触发青少年保护机制?开源检测脚本+实时响应策略(限24小时领取)》

更多请点击: https://intelliparadigm.com 第一章:ElevenLabs青少年语音保护机制的技术本质与合规边界 ElevenLabs 的青少年语音保护机制并非简单的年龄声明开关,而是一套融合前端约束、后端策略引擎与联邦学习辅助验证的多层技术栈。其核心…...

别再只画图了!深度解读R语言列线图结果:如何从lrm模型输出看懂每个变量的影响大小?

从模型输出到临床洞察:R语言列线图结果深度解析指南 当你第一次看到lrm模型输出的那堆"Effects"和"Odds Ratio"时,是不是感觉像在解读外星文?别担心,这正是从"会画图"到"懂原理"的必经之…...

WPF-VisionMasterOpenCV

WPF-VisionMasterOpenCV 一、项目概述 WPF-VisionMasterOpenCV 是一个基于 WPF EmguCV(OpenCV的.NET封装)开发的机器视觉软件框架。它采用节点流程图的方式,让用户可以通过拖拽节点来构建视觉检测流程。 项目架构 WPF-VisionMaster/ ├─…...

CANN-昇腾NPU分布式训练-8卡到64卡怎么线性扩展

8 卡训练 Llama2-7B 的吞吐约 1800 tokens/s/p。64 卡应该是 8 卡的 8 倍吗?实际上只能到 6-7 倍。缺失的 1-2 倍被通信开销吃了。这篇分析昇腾NPU上分布式训练的扩展效率。 扩展效率定义 扩展效率 实际加速比 / 理论加速比8 卡 → 64 卡:理论加速比 8…...

BinaryBomb通关后,我总结了这6个Linux调试与逆向的‘骚操作’

BinaryBomb通关后,我总结了这6个Linux调试与逆向的‘骚操作’ 在计算机系统基础课程中,BinaryBomb实验堪称是检验学生调试与逆向能力的"试金石"。作为一位刚刚通关的"拆弹专家",我想分享那些教科书上不会教、却能让你效率…...

华为OD机试真题 新系统 2026-05-20 PythonJS 实现【等距二进制判断】

目录 题目 思路 Code 题目 对于一个二进制数,我们定义相邻两个 1 之间的 0 的数量为它们两个之间的距离,如 1001011,相邻两个 1 之间的距离从左到右分别为 2、1、0。 现在如果一个整数转化为二进制数满足如下条件: 1. 包含不少于 3 个 1 2. 所有相邻数字 1 之间的距离都…...

Mythos模型的技术本质:执行态建模与终端状态感知

1. 这不是一次普通模型发布:Mythos背后的真实技术分水岭 “Claude Mythos Preview”这七个字,最近在安全圈和AI工程一线引发的震动,远超多数人最初预估。它不是又一个参数堆叠的“更大模型”,也不是一次常规的SOTA刷新——它是一次…...

从靶场搭建到防御加固:一次Hydra爆破Win7 SMB的完整复盘与安全启示

从攻击到防御:SMB协议安全实战分析与加固指南 当一台运行Windows 7系统的计算机暴露在网络中时,它可能正在无声地发出安全警报。SMB协议作为Windows生态中广泛使用的文件共享服务,常常成为攻击者突破内网的第一道门户。本文将从一个真实的渗透…...

别再傻等串口了!用STM32CubeMX+DMA实现串口收发,CPU效率直接拉满

STM32CubeMXDMA串口通信:释放CPU性能的实战指南 在嵌入式系统开发中,串口通信是最基础也最常用的外设之一。然而,传统的轮询或中断方式处理串口数据会大量占用CPU资源,这在需要同时处理电机控制、传感器数据融合等多任务的复杂系统…...

音乐解锁神器:3种方法让加密音乐重获自由

音乐解锁神器:3种方法让加密音乐重获自由 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: https://gitcode.c…...

Ollama REST API 深度解析:如何用 HTTP 接口调用模型

系列导读 你现在看到的是《Ollama 本地大模型管理实战:从部署到调优的完整指南》的第 4/10 篇,当前这篇会重点解决:让读者掌握通过 HTTP 接口编程调用 Ollama 模型的核心技能。 上一篇回顾:第 3 篇《模型加载与运行参数调优:从默认到高性能的实战配置》主要聚焦 教会读者…...

用达尔文进化论重构神经网络设计

1. 这不是科幻脑洞,而是一次严肃的思想实验 “What if Charles Darwin Built a Neural Network?”——这个标题乍看像咖啡馆里哲学系学生的即兴发问,但在我过去十年拆解过37个跨学科AI项目、亲手复现过12种生物启发式学习模型后,我敢说&…...

从“能听见”到“听得清”:一款高集成度AI语音处理模组的落地实践

在嵌入式产品开发中,语音交互功能的开发往往是一个“隐形的坑”。很多团队在Demo阶段用普通麦克风和喇叭一切正常,一到真实环境就问题百出:空调噪音盖过人声、对方听到刺耳的回声、音量开大就爆麦。一、产品定位:解决什么痛点&…...

Cursor AI斜杠命令系统全解析

Cursor AI代码编辑器 的 斜杠命令系统简介 目录 Cursor AI代码编辑器 的 斜杠命令系统简介 一、Skills(技能)类命令 1. `/create-skill` 2. `/babysit` 3. `/canvas` 二、Commands(内置命令)类 1. `/explain` 2. `/read-branch` 3. `/review` 三、使用建议 ,分为Skills(…...

2026年京东云OpenClaw/Hermes Agent配置Token Plan详细搭建教程

2026年京东云OpenClaw/Hermes Agent配置Token Plan详细搭建教程。OpenClaw是开源的个人AI助手,Hermes Agent则是一个能自我进化的AI智能体框架。阿里云提供计算巢、轻量服务器及无影云电脑三种部署OpenClaw 与 Hermes Agent的方案、百炼Token Plan兼容主流 AI 工具&…...