是否有更有效的方法从IIS中运行的PHP实例化COM对象?

时间:2017-01-04 16:11:13

标签: php .net iis com

我正在运行基于IIS中php-cgi.exe加载的网页的网络应用。

我可以创建一个暴露给COM的.NET库,生成一个TLB并注册它:

"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\TlbExp.exe" RomCom.dll
c:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe /u RomCom.dll
c:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe /codebase RomCom.dll /tlb:RomCom.tlb

...并从PHP访问该类的成员:

$commie = new COM("RomCom.LettersClass");
print_r($commie->X);

然而,当以这种方式实例化时,包含COM对象的库在每次PHP执行中需要一些时间来加载 - 我可以通过在microtime()中包裹该行来判断这需要大约0.2秒在我的机器上™。由于中的后续实例每个PHP执行的成本要低得多,我认为这个成本要么是由于查找了COM库,要么是在将库加载到PHP环境时发生的一些事情。

有没有办法配置PHP环境,或者可能是IIS,以加快(重复)加载此COM对象的速度?

奖金问题:我问的是正确的问题,还是有更好的方式从PHP调用.NET代码?我已经阅读了NetPhp库,但我的理解是它使用了COM类,因此会受到相同的性能损失。

1 个答案:

答案 0 :(得分:1)

200ms对于加载CLR似乎相当高,你还应该考虑做一些CPU分析来确定这么长时间。您可能会看到来自组装或延迟初始化一些昂贵对象的相当大的好处。除非你看,否则你不会知道。您还可以增加回收时间,以减少负载数量。

这是服务组件或进程外服务器的理想选择。在任何一种情况下,最终都会使用.Net COM Server在不同的进程中运行,该进程持续超出调用php-cgi进程的生命周期。

Serviced Components in VB.NET有一个很好的概述,可以很容易地翻译成C#。 MSDN上的.Net 2中也有a sample。在这两种情况下,您都可以忽略事务性内容。

更现代的路线是拥有本地WCF或MVC Web服务。无论您使用COM还是Web服务,都应该获得大致相同的性能,这实际上取决于您最适合开发和排除故障的内容。