加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 与zend(多维数组)交换数据

发布时间:2020-12-15 10:18:43 所属栏目:大数据 来源:网络整理
导读:我将PHP嵌入我的应用程序(在Delphi 2010中编写),使用PHP4Delphi组件与php5ts.dll进行接口。 我想我的程序作为PHP(sapi模块?)的扩展,因为它注册了一些可以在PHP脚本中使用的函数和常量…无论如何,使用简单的数据类型时效果很好,但是当我尝试使用多维数组
我将PHP嵌入我的应用程序(在Delphi 2010中编写),使用PHP4Delphi组件与php5ts.dll进行接口。
我想我的程序作为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
爱因斯坦

解决方法

这是我的工作
function InitSubArray(TSRMLS_DC : pointer):pzval;
begin
  Result := MAKE_STD_ZVAL;
  Result^.refcount:=2;
  Result^._type:=IS_ARRAY;
  InitPHPArray(Result,TSRMLS_DC);
end;

设置引用2为我解决问题,我不知道为什么,只是尝试了很多次,并发现了这一点。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读