Руководство по PHP
Пред. |  | След.

# Глава 57. PHP и COM

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

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?

1. Я построил DLL для вычисления кое-чего. Можно ли запустить эту DLL из PHP?

Если это простая DLL, то пока ещё нет возможности вызвать её из PHP. Если DLL содержит COM сервер, то вы могли бы получить доступ к ней, если она реализует интерфейс IDispatch.

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

Существуют дюжины VARIANT типов и их комбинаций. Большинство из них уже поддерживается, но несколько всё ещё не реализованы. Массивы поддерживаются не полностью. Только одномерные индексированные массивы могут передаваться между PHP и COM. Если вы обнаружите неподдерживаемые типы, пожалуйста, сообщите о них как об ошибке (если это ещё не сделано) и предоставте всю доступную информацию.

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

В общем да, но так как PHP в основном используется как скриптовый язык для web и выполняется в контексте web сервера, то визуальные объекты никогда не появятся на рабочем столе (desktop) сервера. Если вы используете PHP как скрипт для приложений, например в связке с PHP-GTK, тогда нет ограничений на доступ и манипулирование визуальными объектами через COM.

4. Могу ли я сохранять COM объекты в сессии?

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

5. Как я могу поймать COM ошибки?

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

В PHP 4 поймать COM ошибки средствами, отличными от тех, что предлагает сам PHP (@, track_errors, ...) невозможно.

6. Можно ли генерировать DLL файлы из PHP скриптов как это можно делать в Perl?

Нет, к сожалению такое средство недоступно для PHP.

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

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

- неправильный CLSID

- отсутствует запрошенная DLL

- запрошенный компонент не реализует интерфейс IDispatch

8. Как можно запускать COM объекты с удалённого сервера?

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

Убедитесь, что в вашем `php.ini` вы установили com.allow_dcom =`TRUE`.

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

Отредактируйте ваш `php.ini` и установите com.allow_dcom =`TRUE`.

10. Возможно ли с помощью PHP загрузить/манипулировать ActiveX объектом на странице?

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

11. Возможно ли получить выполняющийся экземпляр компонента?

Это возможно с помощью моникеров. Если вы хотите получить несколько ссылок на один и тот же экземпляр Word, вы можете создать этот экземпляр как показано:

`<?php $word = new COM("C:\docs\word.doc"); ?>`

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

12. Есть ли способ обработать событие, посланное COM объектом?

Используя com_event_sink() вы можете определить приёмник события и привязать его. Вы можете заставить PHP сгенерировать скелет класса приёмника событий, используя com_print_typeinfo().

13. У меня возникают проблемы при попытке вызвать метод COM объекта, который предоставляет более чем один интерфейс. Что я могу сделать?

Ответ так же прост как и неудовлетворителен. Не знаю точно, но думаю, что вы не можете ничего сделать. Если у кого-то есть точная информация по этому вопросу, пожалуйста, дайте мне знать :)

14. Значит PHP работает с COM, как насчёт COM+?

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

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

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

Пред. | Начало | След.
PHP и HTML | Уровень выше | PHP и другие языки