我有一个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崩溃的)但问题并没有消失。
那么,有什么想法吗?我做错了什么(每次第二次正确阅读价值时怎么会出错?)
环境测试:
更新:问题最终出现在C#代码中。有一个调用GC,它不允许正确关闭/删除COM对象,因此C#挂起(再次没有异常)并“触发”php致命错误。
感谢您的回复。
答案 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致命错误。