与zend交换数据多维数组

问题描述

|| 我正在使用PHP4Delphi组件与php5ts.dll交互,将PHP嵌入我的应用程序(用Delphi 2010编写)中。 我猜我的程序充当了PHP(sapi模块?)的扩展,因为它注册了一些可以在PHP脚本中使用的函数和常量...无论如何,在使用简单数据类型时效果很好,但是当我尝试使用多维数组时作为返回值我得到错误
Access violation at address 01CD3C35 in module \'php5ts.dll\'. Read of address 0231E608.
堆叠清单
(000A2C35){php5ts.dll} [01CD3C35] destroy_op_array + $35
(004C4D61){myApp.exe } [008C5D61] php4delphi.TPHPEngine.ShutdownEngine (Line 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;
我是否必须在某个地方“注册”我创建的子数组?我是否必须增加或减少
refcount
或设置
is_ref
? IOW,必须如何设置子数组的return_value和zvals? 我尝试对每个数组的refcount加1(尽管MAKE_STD_ZVAL已经将refcount初始化为1),并且可以治愈AV,但是有时执行脚本时应用只是消失了-我怀疑它会导致引擎的内存管理器无限递归,崩溃了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 爱因     

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)