Неустранимая ошибка PHP при создании объекта Com
У меня есть веб-приложение php, которому нужно получить доступ к источнику данных PI-Datas, используя библиотеку приложений, написанную для окон в форме dll, для извлечения данных. Из-за неполиморфизма PHP мы используем оболочку, написанную на C#-Dotnet, чтобы использовать библиотеку полиморфизма.
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
Поэтому я попытался сгенерировать еще больше ком объектов.
$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 ответа
ОБНОВЛЕНИЕ: проблема была наконец в коде C#. Был вызов GC, который не позволял правильно закрывать / удалять COM-объект, в результате чего C# зависал. Объект где-то хранился в Ram, и во второй раз вызывался обертка, он просто зависал / выходил (опять же без исключения), что "вызывало" фатальную ошибку php.
Если возврат потерпел неудачу без входа в файл, посмотрите, что в коде есть знак @
,
Пример:
@some_function()
Это вызовет функцию, но если есть какие-либо ошибки, она не будет показана вам, просто пропущена. Из-за некоторых ошибок PHP может быть остановлен.
Но вы можете попробовать обновить PHP до 5.5 на сервере Windows?
Если вы знаете, в какой из строк кода выдается ошибка и хотите пропустить, просто поставьте isset()
Если isset($somevar)
или же isset(function())
возвращает true, что означает, что это не ошибки, но если вы не хотите останавливать функцию при ошибках isset()
в строке кода, где произошли ошибки.
Я не уверен, как выглядит класс и функция внутри PHP->Wrapper->Lib->PI-System
код, чтобы я мог сказать полностью исправленный ответ.