Новые книги

Подход, предложенный Люком Вроблевски, произвел настоящую революцию в области веб-дизайна. Его суть проста: чтобы сайт наиболее полно удовлетворял потребности пользователей любых устройств, сначала следует проектировать его мобильную версию.

В своей книге Люк подробно рассказывает о том, как перейти от создания обычных сайтов к разработке их мобильных версий, какие особенности поведения владельцев мобильных устройств следует учитывать при проектировании интерфейса, как правильно организовать контент и навигацию и о многом-многом другом.

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

Издано с разрешения A Book Apart LLC На русском языке публикуется впервые.

Все права защищены.

Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских прав.
В процессе чтения вы познакомитесь с основами программирования и, в частности, языка JavaScript, а также выполните несколько небольших проектов. Один из самых интересных проектов — создание своего языка программирования.

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 ещё не может обслуживать транзакции. Таким образом, если возникает ошибка, откат не инициируется. Если вы используете компоненты, которые поддерживают транзакции, вам нужно будет реализовать обслуживание транзакций самостоятельно.


Назад Оглавление Вперёд
PHP и HTML Вверх PHP и другие языки