我正在研究一個PHP擴展,並希望讓PHP返回一個結構。但它總是造成核心轉儲。我的步驟是:PHP擴展返回結構
./ext_skel --extname=test
./configure --enable-test
在
php_test.h
,添加:typedef struct mydata { int m_id; int m_age; }MYDATA; PHP_FUNCTION(wrap_getMydata);`
在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); }
附加:
var_dump(test_getMydata(3,4))
在test.php
然後
make; make install; ./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 ../../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) {`
有人可以給些幫助?
有沒有人提供一些線索? – 2014-09-30 13:51:09
我認爲它的一個問題與您的變量範圍 嘗試類似: ' MYDATA * objData; objData = emalloc(sizeof(objData)); objData-> m_id = a; objData-> m_age = b; ZEND_REGISTER_RESOURCE(return_value,res,resid); ' – 2015-05-08 17:48:28