PHP случайные проблемы с COM-объектами на WAMP - PullRequest
2 голосов
/ 12 июля 2011

Я использую старый объект COM / ActiveX-control в приложении PHP.Работает под Windows / Apache.Обычно все в порядке, но иногда я получаю

Не удалось создать COM-объект 'TTF161.TTF1': Objektserver wird beendet, wenn der OLE-Dienst ihn aufruft.

Немецкая часть сообщения означает что-то вроде Objectserver завершается, когда OLE-сервис вызывает его .

Я попытался заключить создание объекта в try-catch, но это не работает.

Проблема возникает случайным образом с тем же запросом.Так что это не связано ни с какой логикой программирования, и я предполагаю, что этот старый компонент просто немного глючит и время от времени дает сбой.Но я хотел бы справиться с такой ситуацией, например, попытаться еще раз или дать пользователю лучшее сообщение об ошибке.Я мог бы также представить, что это связано с количеством потоков Apache или процессов.В журнале событий ничего не указывается, а также журнал ошибок Apache пуст.

Буду признателен за любую подсказку о том, как я могу решить проблему или найти дополнительную информацию.

1 Ответ

1 голос
/ 01 мая 2012

У меня работает следующий код (Win XP SP3, PHP 5.2.17 (cli) (сборка: 6 января 2011 17:37:45)):

<?php
  try
  {
    echo "Trying to create object"."\r\n";
    $obj = new COM("FailingObject");
    echo "Object created";
  }
  catch(com_exception $e)
  {
    echo "Caught exception"."\r\n";
    $c = $e->getCode();
    $m = $e->getMessage();
    echo "Error Code: ".dechex($c)."\r\n";
    echo $m;
  }
?>

Выполнение этого скрипта с использованием PHP в командной строке дает ожидаемый результат:

Попытка создать объект
Пойманное исключение
Код ошибки: 80080008
Не удалось создать COM-объект FailingObject: сервер объектов останавливается, когда
Сервис OLE связывается с ним

Протестированный объект "FailingObject" представляет собой простой COM-объект ATL, который использует

HRESULT FinalConstruct()
{
    return CO_E_SERVER_STOPPING;
}

для имитации ошибки при создании объекта.

Мое лучшее предположение (и я могу быть совершенно неправ в этом), что в вашем случае ошибка вызывается не созданием объекта, а другим COM-вызовом где-то в PHP, который затем обрабатывается неправильно.

Вы можете рассмотреть возможность отправки отчета об ошибке для этого поведения, потому что обычно вы должны быть в состоянии отловить ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...