Неустранимая ошибка PHP при создании Com-объекта

У меня есть веб-приложение php, которому необходимо получить доступ к PI-Datasource, используя библиотеку приложений, написанную для окон в форме dll, для извлечения данных. Из-за отсутствия полиморфизма PHP мы используем оболочку, написанную на C#-Dotnet, чтобы использовать библиотеку полиморфизма.

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

Проблема: PHP падает, не оставляя лога, при создании com-объекта (почти всегда при каждом втором запросе). Я подумал, что, возможно, что-то в существующем php-коде может быть неправильным, что вызывает эту фатальную ошибку, и после долгих отладок и попыток я упростил код до этого:

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

при этом переменная $connection не используется НИКОГДА! и все же каждый второй раз я получаю php-сбой (задокументировано в журнале ошибок 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, вызвать деструктор из С#, проверить конструктор из С# (который просто создает объект библиотеки и не имеет исключений, объект был нормально создан и все равно 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 (несколько разных версий)

ОБНОВЛЕНИЕ: проблема, наконец, была в коде С#. Был вызов GC, который не позволял правильно закрыть/удалить COM-объект, в результате чего С# завис (опять же без исключений) и «вызвал» фатальную ошибку php.

Спасибо за ответы.


person Stef    schedule 26.07.2013    source источник


Ответы (2)


Если возврат завершается с ошибкой без входа в файл, похоже, что в коде есть знак @.

Пример:

@some_function()

Это вызовет функцию, но если есть какие-либо ошибки, она не покажет вам, просто пропустит. Из-за некоторых ошибок PHP может быть остановлен.

Но можете ли вы попробовать обновить PHP до версии 5.5 на сервере Windows?

Если вы знаете, в какой из строк кода выдает ошибку и хотите ее пропустить, просто поставьте isset()

Если isset($somevar) или isset(function()) возвращает true, это означает, что это не ошибки, но если вы не хотите останавливать функцию при ошибках, поместите isset() в строку кода, где произошли ошибки.

Я не уверен, как выглядит класс и функция внутри кода PHP->Wrapper->Lib->PI-System, поэтому я могу дать полностью исправленный ответ.

person Marin Sagovac    schedule 26.07.2013

ОБНОВЛЕНИЕ: проблема, наконец, была в коде С#. Был вызов GC, который не позволял корректно закрыть/удалить COM-объект, в результате чего C# завис. Объект где-то хранился в Ram, и при втором вызове оболочки он просто завис/вышел (опять же без исключений), что «вызвало» фатальную ошибку php.

person Stef    schedule 01.08.2013