返回信息流想封装一下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) {`
这个问题是啥呢?
这是一条镜像帖。来源:北邮人论坛 / cpp / #82961同步于 2014/9/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[问题]PHP扩展库开发,想得到struct/object ,总是core dump
outgoing
2014/9/30镜像同步3 回复
订阅后,新回复会通过你的通知中心匿名送达。
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分配全局内存或者其他方式