BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #82961同步于 2014/9/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

[问题]PHP扩展库开发,想得到struct/object ,总是core dump

outgoing
2014/9/30镜像同步3 回复
想封装一下C或者C++的接口,在PHP中获得结构体或者对象的元素的值,从网上搜了下方法,大致步骤如下,但最后我的结果是core dump了。 1. ./ext_skel --extname=test 2. ./configure --enable-test 3. 在 php_test.h, 添加代码: typedef struct mydata { int m_id; int m_age; }MYDATA; PHP_FUNCTION(wrap_getMydata); 4.在文件 test.c, 增加: #define MY_RES_NAME "my_resource"; static int my_resource_descriptor; PHP_FE(wrap_getMydata, NULL) ... ZEND_MINIT_FUNCTION(test) { /* If you have INI entries, uncomment these lines REGISTER_INI_ENTRIES(); */ resid = zend_register_list_destructors_ex(NULL, NULL, MY_RES_NAME, module_number); return SUCCESS; } PHP_FUNCTION(test_getMydata) { zval* res; long int a, b; long int result; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &a, &b) == FAILURE) { return; } MYDATA objData; objData.m_id = a; objData.m_age = b; ZEND_REGISTER_RESOURCE(res, &objData, resid); RETURN_RESOURCE(res); }` 4. 在test.php中增加测试代码: var_dump(test_getMydata(3,4)) 5. 执行: make; make isntall; ../../bin/php test.php ,然后输出: Functions available in the test extension: confirm_wrap_compiled test_getMydata Congratulations! You have successfully modified ext/wrap/config.m4. Module wrap is now compiled into PHP. Segmentation fault (core dumped) 使用GDB看了下: $gdb ../../bin/php core.23310 `Loaded symbols for /home/user1/php/php-5.2.17/lib/php/extensions/no-debug-non-zts-20060613/test.so 0 0x00000000006388ad in execute (op_array=0x2a9569bd68) at /home/user1/php/php-5.2.17/Zend/zend_vm_execute.h:92 92 if (EX(opline)->handler(&execute_data TSRMLS_CC) > 0) {` 这个问题是啥呢?
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
outgoing机器人#1 · 2014/10/1
顶啊~
jmpesp机器人#2 · 2014/10/1
objData是局部变量,用ZEND_REGISTER_RESOURCE进行赋值,会运行时出错。要用emalloc分配全局内存或者其他方式
outgoing机器人#3 · 2014/10/3
我将其改成了: MYDATA objData; objData.m_id = a; objData.m_age = b; ZEND_REGISTER_RESOURCE(res, &objData, resid); MYDATA* objData = (MYDATA*)emalloc(sizeof(MYDATA)); objData->m_id =a ; objData->m_age = b; ZEND_REGISTER_RESOURCE(res, objData, resid); RETURN_RESOURCE(res); 然后在test.php中的输出为: Functions available in the test extension: confirm_wrap_compiled test_getMydata Congratulations! You have successfully modified ext/wrap/config.m4. Module wrap is now compiled into PHP. resource(0) of type (unknown). 这个看起来是这个资源没有注册吧。 我的想法是想返回类似一个对象,然后打印出每个元素的值。 【 在 jmpesp 的大作中提到: 】 : objData是局部变量,用ZEND_REGISTER_RESOURCE进行赋值,会运行时出错。要用emalloc分配全局内存或者其他方式