PHP и COM
Глава 52. 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. Можно ли загрузить/манипулировать ActiveX-объектом на странице с помощью РНP ?
- 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. Если вы обнаружили другие типы, которые не поддерживаются, сообщите, пожалуйста, о них как о bug (если это ещё не сделано) и предоставьте как можно более подробную информацию.
3. Можно ли манипулировать визуальными объектами в PHP ?
Вообще-то да, но, поскольку PHP в основном используется как язык web-скриптинга, он работает в контексте web-серверов; таким образом, визуальные объекты никогда не появляются на рабочем столе серверов. Если вы используете PHP для скриптинга приложений, например, в соединении с PHP-GTK, нет никаких ограничений при доступе и манипуляциях с визуальными объектами через COM.
4. Могу ли я сохранить COM-объект в сессии ?
Нет, не можете. COM-экземпляры рассматриваются как ресурсы, и поэтому они могут быть доступны только в контексте отдельного скрипта.
5. Как я могу отловить COM-ошибки ?
В настоящее время невозможно отлавливать 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-конструктору.
Убедитесь, что вы установили com.allow_dcom=true в вашем php.ini.
9. Я получил 'DCOM is disabled in C:\path...\scriptname.php on line 6', что я могу сделать ?
Отредактируйте ваш php.ini и установите com.allow_dcom=true.
10. Можно ли загрузить/манипулировать ActiveX-объектом на странице с помощью РНP ?
В PHP ничего сделать нельзя. ActiveX-объекты загружаются на стороне клиента, если запрашиваются HTML-документом. Никакой связи с PHP-скриптом нет, и, следовательно, нет возможности прямого взаимодействия на сервере.
11. Можно ли получить работающий экземпляр компонента ?
Это можно сделать с помощью клички/moniker. Если вы хотите получить несколько ссылок на один экземпляр word, вы можете создать этот экземпляр так:
$word = new COM("C:\docs\word.doc"); |
Это создаст новый экземпляр, если нет доступного работающего экземпляра, или буде возвращён дескриптор/handle работающего экземпляра, если он имеется.
12. Есть ли способ обработать событие, посланное от COM-объекта ?
Пока нет.
13. У меня появились проблемы при попытке вызвать метод COM-объекта, имеющего не один интерфейс. Что можно предпринять ?
Ни шиша. Я точно не знаю, но думаю, что ничего. Если кто-нибудь имеет информацию об этом, пожалуйста, дайте мне знать.
14. Итак, PHP работает COM, а как насчёт COM+ ?
COM+ расширяет COM с помощью каркаса для обслуживания компонентов через MTS и MSMQ, но нет ничего специального для обслуживания таких компонентов в PHP.
15. Если PHP может манипулировать COM-объектами, можно ли представить использование MTS для обслуживания ресурсов компонентов в соединении с PHP ?
Сам PHP ещё не может обслуживать транзакции. Таким образом, если возникает ошибка, откат не инициируется. Если вы используете компоненты, которые поддерживают транзакции, вам нужно будет реализовать обслуживание транзакций самостоятельно.