PHP и COM

На платформах Win32 языком PHP пользуются для доступа к COM- и DCOM-объектам.

  1. Я собрал DLL-библиотеку для вычислений. Каким способом запустить DLL-файл под PHP?
  2. Что значит 'Unsupported variant type: xxxx (0xxxxx)'?
  3. Возможно ли манипулирование визуальными объектами в PHP?
  4. Можно ли сохранять COM-объект в сессии?
  5. Как отлавливать ошибки COM?
  6. Можно ли генерировать DLL-файлы из PHP-скриптов так, как это делают в языке Perl?
  7. Что значит 'Unable to obtain IDispatch interface for CLSID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}'?
  8. Как COM-объекты запускают с удалённого сервера?
  9. Я получаю 'DCOM is disabled in C:\path...\scriptname.php on line 6', что делать?
  10. Умеет ли PHP загружать и манипулировать объектом ActiveX на странице?
  11. Можно ли получить экземпляр компонента, который выполняется?
  12. Как обработать событие, которое отправил COM-объект?
  13. При попытке вызвать метод COM-объекта возникли проблемы, который даёт больше одного интерфейса. Что делать?
  14. Итак, PHP работает с моделью COM, а что насчёт технологии COM+?
  15. Раз PHP умеет манипулировать COM-объектами, можно ли представить, что служба MTS управляет ресурсами компонентов в сочетании PHP?
Я собрал DLL-библиотеку для вычислений. Каким способом запустить DLL-файл под PHP?

PHP пока не умеет запускать просто DLL-библиотеки, но если DLL-файл содержит COM-сервер и библиотека реализует интерфейс IDispatch, для PHP откроется доступ к такому серверу.

Что значит 'Unsupported variant type: xxxx (0xxxxx)'?

В конкретных языках программирования определяют десятки типов данных VARIANT и их комбинаций. Бо́льшую часть вариантов PHP уже поддерживает, но отдельные варианты в языке по-прежнему не реализовали. Массивы поддерживаются не на 100 %. Между PHP и COM разрешается передавать только одномерные индексные массивы. Пожалуйста, сообщите о других типах как об ошибке, если не сделали это раньше, если обнаружите типы, которые PHP не поддерживает, и дайте как можно больше информации.

Возможно ли манипулирование визуальными объектами в PHP?

Да, PHP умеет манипулировать визуальными объектами, но поскольку PHP чаще работает как язык веб-скриптов и запускается в контексте веб-сервера, визуальные объекты не появятся на рабочем столе сервера. Доступ и манипулирование визуальными объектами через COM не ограничиваются, когда на PHP пишут приложения, например, в связке с модулем PHP-GTK.

Можно ли сохранять COM-объект в сессии?

Нет, нельзя, поскольку экземпляры COM рассматриваются как ресурсы, они доступны только в контексте одного скрипта.

Как отлавливать ошибки COM?

Модуль COM выбрасывает исключение com_exception, которое перехватывают, а затем проверяют в исключении свойство code, чтобы понять, что делать дальше.

Можно ли генерировать DLL-файлы из PHP-скриптов так, как это делают в языке Perl?

Нет, для PHP такого инструмента нет.

Что значит 'Unable to obtain IDispatch interface for CLSID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}'?

Эта ошибка возникает по разным причинам:

  • неправильный ключ CLSID
  • DLL-библиотека, которую запросили, отсутствует
  • компонент, который запросили, не реализует интерфейс IDispatch

Как COM-объекты запускают с удалённого сервера?

Точно так же, как запускают локальные объекты. Потребуется только передать IP-адрес удалённой машины как второй параметр конструктора COM.

Убедитесь, что включили директиву com.allow_dcom=true в файле php.ini

Я получаю 'DCOM is disabled in C:\path...\scriptname.php on line 6', что делать?

Отредактируйте файл php.ini и включите директиву com.allow_dcom=true.

Умеет ли PHP загружать и манипулировать объектом ActiveX на странице?

Это не имеет отношения к PHP. Объекты ActiveX загружаются на стороне клиента, если их запросил HTML-документ. Связи с PHP-скриптом здесь нет, поэтому прямое взаимодействие со стороны сервера невозможно.

Можно ли получить экземпляр компонента, который выполняется?

Экземпляр получают через моникеры (англ. monikers). Экземпляр создают вот так, когда требуется получить больше одной ссылки на один и тот же экземпляр Word:

<?php

$word
= new COM("C:\docs\word.doc");

?>

Код создаст новый экземпляр, если нет доступного запущенного экземпляра, или вернёт дескриптор запущенного экземпляра, если экземпляр доступен.

Как обработать событие, которое отправил COM-объект?

Приёмник события определяют и привязывают функцией com_event_sink(). Скелет класса приёмника событий функция в PHP генерирует функция com_print_typeinfo().

При попытке вызвать метод COM-объекта возникли проблемы, который даёт больше одного интерфейса. Что делать?

Ответ настолько же простой, насколько и неудовлетворительный. Точно не известно, но, скорее всего, ничего сделать невозможно.

Итак, PHP работает с моделью COM, а что насчёт технологии COM+?

Технология COM+ расширяет модель COM за счёт платформы управления компонентами через службу MTS и MSMQ-очередь, но PHP не поддерживает ничего отдельно, чтобы работать с такими компонентами.

Раз PHP умеет манипулировать COM-объектами, можно ли представить, что служба MTS управляет ресурсами компонентов в сочетании PHP?

Сам PHP пока не обрабатывает транзакции. Поэтому, если возникает ошибка, откат не инициируется. При работе с компонентами, которые поддерживают транзакции придётся реализовать управление транзакциями самому.