问题标签 [php4delphi]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1198 浏览

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

我在我的应用程序中嵌入 PHP(用 Delphi 2010 编写),使用 PHP4Delphi 组件与 php5ts.dll 进行交互。我猜我的程序充当 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?
我正在使用的模式是

我是否必须在某个地方“注册”我创建的子数组?我必须增加或减少refcount或设置is_ref吗?IOW,必须如何设置子数组的 return_value 和 zvals?
我尝试将 1 添加到每个数组的 refcount(虽然 MAKE_STD_ZVAL 已经将 refcount 初始化为 1)并且可以治愈 AV 但有时应用程序在执行脚本时会消失 - 我怀疑它会导致引擎的内存管理器中的无限递归,导致 php DLL 和随身携带应用程序...当将 refcount 设置为 0(零;假设在 PHP 脚本中分配返回值时,它的 refcount 将为 1,然后当 PHP 变量超出范围时,它将被销毁)似乎工作(即没有崩溃,没有 AV)但脚本不会生成任何输出,只是空的 html 文件......

我还将数据作为数组发送到我的函数中,然后使用zend_hash_findzend_hash_get_current_data来读取数据。这会弄乱变量的引用计数吗?zend_hash_find即,当我完成它时,我是否必须减少返回的变量的 refcout ?
迭代数组时重用相同的变量是否安全,即

还是应该循环的每次迭代都创建/释放 Val?

TIA
艾因

0 投票
3 回答
2822 浏览

php - 使用 Delphi 2010 和 php4Delphi 编写 PHP 扩展

首先这是关于php4Delphi而不是RadPHP(以前的 Delphi For PHP)。

使用

  • 德尔福 2010
  • PHP 5.3.6 (VC9, NTS)
  • php4Delphi 7.2(使用 VC9 指令编译)
  • 视窗服务器 2008 R2
  • IIS 7

当尝试在 IIS/PHP 服务器上运行 php4Delphi delphi_math.dll 示例扩展时,我在 C:\Windows\Temp\php-errors.log 文件中看到以下错误。

[15-Jun-2011 17:58:42] PHP 警告:PHP 启动:无法加载动态库 'C:\Program Files (x86)\PHP\ext\delphi_math.dll' - 动态链接库 (DLL) 初始化例行公事失败。在第 0 行的未知中

我已经解决了 PHP 没有找到我的扩展的初始问题,所以这不是路径样式问题。

我在想 php4Delphi 7.2 可能不支持最新的 PHP 5.3.6。有没有人让这个配置为他们工作?