从 PHP 调用的 COM dll 不会为空变量

Posted

技术标签:

【中文标题】从 PHP 调用的 COM dll 不会为空变量【英文标题】:COM dll called from PHP doesn't empty variables 【发布时间】:2021-02-25 11:37:28 【问题描述】:

我最近开始出现的问题并没有出现在任何地方。

前端 (html/js) 调用 php 页面。 PHP 依次从 COM dll (vb6) 调用函数。 COM dll 确实轮流使用了一些较低级别的 C++ .dll,但不确定这些信息是否相关。

现在,最近(以前没有发生过这种情况),在一个特定的 COM dll 函数中,我们称它为 BringClients(),有时(显然发生了一些用户并发 - 竞争条件?)一个全局变量,比如说 ClientName,它是在调用函数时BringClients() 中使用的不是空的,而是保存一个值,该值是在函数UpdateClients() 上设置的,当该函数在完全不同的COM dll 实例中由完全不同的用户调用时。

我不知道为什么会这样。 .dll 初始化时,所有 COM dll 变量不都是空的吗?我通过在每次初始化 .dll 时手动清空变量来解决它,但这是否应该发生?我没有注意到其他功能上的类似问题。

操作系统是带有 IIS 的 Windows 服务器。

【问题讨论】:

在这种情况下,共享/全局变量通常是可疑的。 那或有人不知道 VB6(与大多数 BASIC 一样)默认传递变量 ByRef 而不是 ByValClientName 被传递给 UpdateClients(),在那里进行了更改 (因此它在调用代码中也发生了改变)并随后传递给BringClients() 【参考方案1】:

我不知道 PHP 如何与 COM 组件交互,但我猜你并没有真正初始化 DLL,而是创建了对象。而且您的 COM 库是单元线程的,因此您将在每个线程中获得一组独立的变量。

但是,如果 IIS 稍后根据它用于平衡请求的任何调度使用相同的线程(来自池),会发生什么情况?然后任何全局/公共模块级数据变量将仍然存在。

所以是的,如果您需要确保不重复使用这些变量,您将不得不清除它们或重新架构以删除所有全局变量。

【讨论】:

以上是关于从 PHP 调用的 COM dll 不会为空变量的主要内容,如果未能解决你的问题,请参考以下文章

PHP 源码学习 | 变量类型数据结构

如何从 PHP 进行 Win32 API 调用?

PHP 从 Ajax 调用接收空的 $_POST 变量

从 DLL 链接到 OpenGL:运行时 glew 函数为空

MSBuild 脚本中的 Bamboo 变量值为空

PHP - 判断变量是否为空