我想我的程序作为PHP(sapi模块?)的扩展,因为它注册了一些可以在PHP脚本中使用的函数和常量…无论如何,使用简单的数据类型时效果很好,但是当我尝试使用多维数组作为返回值我得到错误
访问冲突在模块’PHP5ts.dll’中的地址01CD3C35。阅读地址0231E608。
堆栈列表
(000A2C35){PHP5ts.dll} [01CD3C35] destroy_op_array $ 35
(004C4D61){myApp.exe} [008C5D61] PHP4delphi.TPHPEngine.ShutdownEngine(第1497行,“PHP4delphi.pas”17)$ 7
PHP4delphi.pas中的第1497行是调用tsrm_shutdown();
对我来说,看起来垃圾收集器在脚本结束时崩溃,所以我怀疑我不会将数据正确地发送回引擎…
因此我的问题是如何将多维数组发送回PHP?
我使用的模式是
var subArray: pzval; _array_init(return_value,nil,0); for x := 0 to Data.Count-1 do begin subArray := MAKE_STD_ZVAL; _array_init(subArray,0); // populate subarray with data,including other subarrays ... // add subarray to the main array add_index_zval(return_value,x,subArray); end;
我必须在某个地方“注册”我创建的子阵列吗?我是否必须增加或减少引用计数或设置is_ref? IOW,子阵列的return_value和zval必须如何设置?
我尝试在每个数组的引用计数中添加1(尽管MAKE_STD_ZVAL已经将引用计数器初始化为1),并且固化AV,但是在执行脚本时有时应用程序就会消失 – 我怀疑它在引擎的memeory manager中导致无限递归,从而崩溃了PHP DLL拿它的应用程序…
当将refcount设置为0(零时;假设当PHP脚本中的返回值被分配时,它的refcount将为1,然后当PHP变量超出范围时,它将被销毁)似乎都可以工作(即没有崩溃,没有AV )但脚本不会生成任何输出,只是空的html文件…
我还将数据作为数组发送到我的函数中,然后使用zend_hash_find,zend_hash_get_current_data等来读取数据。这可能会混淆变量的引用吗?那么当我完成它后,我必须减少由zend_hash_find返回的变量的refcout吗?
在迭代数组时重用同一变量是安全的,即
var Val: pppzval; new(Val); zend_hash_internal_pointer_reset(aZendArr^.value.ht); for x := 1 to zend_hash_num_elements(aZendArr^.value.ht) do begin zend_hash_get_current_data(aZendArr^.value.ht,Val); // read data from Val to local variable and do something with it zend_hash_move_forward_ex(aZendArr^.value.ht,nil); end; Dispose(Val);
还是应该每次循环创建/释放Val?
TIA
爱因斯坦