0

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

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

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

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

永远不要使用变量 $connection !并且仍然每 2 次出现 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 个生成都没有问题,并且每 2 次我尝试再次遇到 php 致命错误。我尝试使用所有 50 个,它们都从 PI-System 读取值没有问题。

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

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

测试环境:

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

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

感谢您的回复。

4

2 回答 2

0

如果在没有登录到文件的情况下返回崩溃,它看起来在代码中包含 sign @

例子:

@some_function()

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

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

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

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

我不确定PHP->Wrapper->Lib->PI-System代码中类和函数的外观如何,所以我可以说出完全正确的答案。

于 2013-07-26T12:27:57.647 回答
0

更新:问题最终出在 C# 代码中。对 GC 的调用不允许正确关闭/删除 COM 对象,导致 C# 挂起。该对象保存在 Ram 中的某个地方,第二次调用包装器时它只是挂起/退出(再次无一例外),这“触发”了 php 致命错误。

于 2013-08-01T08:35:30.967 回答