创建Com对象时出现PHP致命错误

时间:2013-07-26 10:33:07

标签: php fatal-error comobject

我有一个php Web应用程序需要使用为dll表单上的windows编写的应用程序库来访问PI-Datasource以获取数据。由于PHP的非polimorphism,我们使用一个用C#-Dotnet编写的包装器来使用polimorphism库。

PHP->Wrapper->Lib->PI-System

问题:PHP在没有留下日志的情况下崩溃了com对象的创建(几乎总是在每个第二个请求上)。我的想法是,现有的PHP代码中的某些东西可能是错误的,导致这个致命的错误,经过大量的调试并尝试将代码简化为:

$connection = new Com('Something.SomethingClass');

变量$ connection永远不会被使用!并且每次第二次我都会得到php-crash(在Windows错误日志中记录为1000-Error和1001-information)

>Faulting application name: php-cgi.exe, version: 5.4.11.0, time stamp: 0x511a30ec
>Faulting module name: KERNELBASE.dll, version: 6.1.7601.17932, time stamp: 0x503275ba
>Exception code: 0xc0000005
>Fault offset: 0x0000d3cf
>Faulting process id: 0x14d0
>Faulting application start time: 0x01ce89dd0ae23748
>Faulting application path: C:\Program Files\Zend\ZendServer\bin\php-cgi.exe
>Faulting module path: C:\Windows\system32\KERNELBASE.dll

所以我试着生成更多的com对象..

$connArray = array();
for($i = 0; $i < 50 ; $i++){
  Core_System_Log::getInstance()->logWithoutMessageId('Before: ' . $i ,Core_System_Log::DEBUG);
  $connArray[i] = new Com('Something.SomethingClass');
  Core_System_Log::getInstance()->logWithoutMessageId('After: ' . $i, Core_System_Log::DEBUG);
}   

所有50个生成都没有问题,并且每次第二次我尝试再次遇到php致命错误。 我尝试使用它们中的所有50个,并且它们都从PI-System读取值没有问题。

我试图取消设置变量并调用gc,从C#调用析构函数,从C#中检查构造函数(它只是创建库的一个对象而且没有异常,对象通常是创建的,但仍然是php崩溃的)但问题并没有消失。

那么,有什么想法吗?我做错了什么(每次第二次正确阅读价值时怎么会出错?)

环境测试:

  • 操作系统:Windows Server 2008 R2 64位/ Windows 7 Prof SP1 32/64位
  • PHP:5.3.9 / 5.3.14 / 5.3.21 / 5.4.11
  • WS:Apache和IIS(几个不同的版本)

更新:问题最终出现在C#代码中。有一个调用GC,它不允许正确关闭/删除COM对象,因此C#挂起(再次没有异常)并“触发”php致命错误。

感谢您的回复。

2 个答案:

答案 0 :(得分:0)

如果在没有登录文件的情况下返回崩溃,则表明代码中包含符号@

示例:

@some_function()

这将调用函数,但如果有任何错误,它将不会向您显示,只是跳过。由于一些错误,PHP可以停止。

但是,您可以尝试在Windows服务器上将PHP升级到5.5吗?

如果您知道哪行代码会引发错误并想跳过,只需添加isset()

如果isset($somevar)isset(function())返回true表示不是错误,但如果您不想停止错误函数,请将isset()放在发生错误的代码行上

我不确定如何在PHP->Wrapper->Lib->PI-System代码中查找类和函数,以便我能够完全正确地回答。

答案 1 :(得分:0)

更新:问题最终出现在C#代码中。有一个调用GC,它不允许正确关闭/删除COM对象,因此C#挂起。该对象保存在Ram中,第二次调用包装器时它被挂起/退出(同样没有异常),这“触发”了php致命错误。