从 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
而不是 ByVal
和 ClientName
被传递给 UpdateClients()
,在那里进行了更改 (因此它在调用代码中也发生了改变)并随后传递给BringClients()
。
【参考方案1】:
我不知道 PHP 如何与 COM 组件交互,但我猜你并没有真正初始化 DLL,而是创建了对象。而且您的 COM 库是单元线程的,因此您将在每个线程中获得一组独立的变量。
但是,如果 IIS 稍后根据它用于平衡请求的任何调度使用相同的线程(来自池),会发生什么情况?然后任何全局/公共模块级数据变量将仍然存在。
所以是的,如果您需要确保不重复使用这些变量,您将不得不清除它们或重新架构以删除所有全局变量。
【讨论】:
以上是关于从 PHP 调用的 COM dll 不会为空变量的主要内容,如果未能解决你的问题,请参考以下文章