mirror of
https://github.com/php/doc-ru.git
synced 2026-03-23 23:32:16 +01:00
293 lines
11 KiB
XML
293 lines
11 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
||
<!-- EN-Revision: e0352653179c355a6b9c353629147b06a2069f24 Maintainer: shein Status: ready -->
|
||
<!-- Reviewed: no -->
|
||
<chapter xml:id="faq.com" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||
<title>PHP и COM</title>
|
||
<titleabbrev>PHP и COM</titleabbrev>
|
||
|
||
<para>
|
||
На платформах Win32 языком PHP пользуются для доступа к COM- и DCOM-объектам.
|
||
</para>
|
||
|
||
<qandaset>
|
||
<qandaentry xml:id="faq.com.q1">
|
||
<question>
|
||
<para>
|
||
Я собрал DLL-библиотеку для вычислений. Каким способом запустить DLL-файл под PHP?
|
||
</para>
|
||
</question>
|
||
<answer>
|
||
<para>
|
||
PHP пока не умеет запускать просто DLL-библиотеки,
|
||
но если DLL-файл содержит COM-сервер и библиотека реализует
|
||
интерфейс IDispatch, для PHP откроется доступ к такому серверу.
|
||
</para>
|
||
</answer>
|
||
</qandaentry>
|
||
|
||
<qandaentry xml:id="faq.com.q2">
|
||
<question>
|
||
<para>
|
||
Что значит 'Unsupported variant type: xxxx (0xxxxx)'?
|
||
</para>
|
||
</question>
|
||
<answer>
|
||
<para>
|
||
В конкретных языках программирования определяют десятки типов данных VARIANT и их комбинаций.
|
||
Бо́льшую часть вариантов PHP уже поддерживает, но отдельные варианты в языке по-прежнему не реализовали.
|
||
Массивы поддерживаются не на 100 %. Между PHP и COM разрешается передавать
|
||
только одномерные индексные массивы. Пожалуйста, сообщите о других типах как об ошибке,
|
||
если не сделали это раньше, если обнаружите типы, которые PHP не поддерживает,
|
||
и дайте как можно больше информации.
|
||
</para>
|
||
</answer>
|
||
</qandaentry>
|
||
|
||
<qandaentry xml:id="faq.com.q3">
|
||
<question>
|
||
<para>
|
||
Возможно ли манипулирование визуальными объектами в PHP?
|
||
</para>
|
||
</question>
|
||
<answer>
|
||
<para>
|
||
Да, PHP умеет манипулировать визуальными объектами, но поскольку PHP чаще работает
|
||
как язык веб-скриптов и запускается в контексте веб-сервера, визуальные объекты
|
||
не появятся на рабочем столе сервера. Доступ и манипулирование визуальными объектами
|
||
через COM не ограничиваются, когда на PHP пишут приложения,
|
||
например, в связке с модулем PHP-GTK.
|
||
</para>
|
||
</answer>
|
||
</qandaentry>
|
||
|
||
<qandaentry xml:id="faq.com.q4">
|
||
<question>
|
||
<para>
|
||
Можно ли сохранять COM-объект в сессии?
|
||
</para>
|
||
</question>
|
||
<answer>
|
||
<para>
|
||
Нет, нельзя, поскольку экземпляры COM рассматриваются
|
||
как ресурсы, они доступны только в контексте одного скрипта.
|
||
</para>
|
||
</answer>
|
||
</qandaentry>
|
||
|
||
<qandaentry xml:id="faq.com.q5">
|
||
<question>
|
||
<para>
|
||
Как отлавливать ошибки COM?
|
||
</para>
|
||
</question>
|
||
<answer>
|
||
<para>
|
||
Модуль COM выбрасывает исключение <literal>com_exception</literal>,
|
||
которое перехватывают, а затем проверяют в исключении свойство <literal>code</literal>,
|
||
чтобы понять, что делать дальше.
|
||
</para>
|
||
</answer>
|
||
</qandaentry>
|
||
|
||
<qandaentry xml:id="faq.com.q6">
|
||
<question>
|
||
<para>
|
||
Можно ли генерировать DLL-файлы из PHP-скриптов так, как это делают в языке Perl?
|
||
</para>
|
||
</question>
|
||
<answer>
|
||
<para>
|
||
Нет, для PHP такого инструмента нет.
|
||
</para>
|
||
</answer>
|
||
</qandaentry>
|
||
|
||
<qandaentry xml:id="faq.com.q7">
|
||
<question>
|
||
<para>
|
||
Что значит
|
||
'Unable to obtain IDispatch interface for CLSID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}'?
|
||
</para>
|
||
</question>
|
||
<answer>
|
||
<para>
|
||
Эта ошибка возникает по разным причинам:
|
||
<itemizedlist>
|
||
<listitem>
|
||
<simpara>
|
||
неправильный ключ CLSID
|
||
</simpara>
|
||
</listitem>
|
||
<listitem>
|
||
<simpara>
|
||
DLL-библиотека, которую запросили, отсутствует
|
||
</simpara>
|
||
</listitem>
|
||
<listitem>
|
||
<simpara>
|
||
компонент, который запросили, не реализует интерфейс IDispatch
|
||
</simpara>
|
||
</listitem>
|
||
</itemizedlist>
|
||
</para>
|
||
</answer>
|
||
</qandaentry>
|
||
|
||
<qandaentry xml:id="faq.com.q8">
|
||
<question>
|
||
<para>
|
||
Как COM-объекты запускают с удалённого сервера?
|
||
</para>
|
||
</question>
|
||
<answer>
|
||
<para>
|
||
Точно так же, как запускают локальные объекты. Потребуется только передать
|
||
IP-адрес удалённой машины как второй параметр конструктора COM.
|
||
</para>
|
||
<para>
|
||
Убедитесь, что включили директиву
|
||
<link linkend="ini.com.allow-dcom">com.allow_dcom</link><literal>=</literal>&true; в файле &php.ini;
|
||
</para>
|
||
</answer>
|
||
</qandaentry>
|
||
|
||
<qandaentry xml:id="faq.com.q9">
|
||
<question>
|
||
<para>
|
||
Я получаю 'DCOM is disabled in C:\path...\scriptname.php on line 6',
|
||
что делать?
|
||
</para>
|
||
</question>
|
||
<answer>
|
||
<para>
|
||
Отредактируйте файл &php.ini; и включите директиву
|
||
<link linkend="ini.com.allow-dcom">com.allow_dcom</link><literal>=</literal>&true;.
|
||
</para>
|
||
</answer>
|
||
</qandaentry>
|
||
|
||
<qandaentry xml:id="faq.com.q10">
|
||
<question>
|
||
<para>
|
||
Умеет ли PHP загружать и манипулировать объектом ActiveX на странице?
|
||
</para>
|
||
</question>
|
||
<answer>
|
||
<para>
|
||
Это не имеет отношения к PHP. Объекты ActiveX загружаются на стороне клиента,
|
||
если их запросил HTML-документ. Связи с PHP-скриптом здесь нет,
|
||
поэтому прямое взаимодействие со стороны сервера невозможно.
|
||
</para>
|
||
</answer>
|
||
</qandaentry>
|
||
<qandaentry xml:id="faq.com.q11">
|
||
<question>
|
||
<para>
|
||
Можно ли получить экземпляр компонента, который выполняется?
|
||
</para>
|
||
</question>
|
||
<answer>
|
||
<para>
|
||
Экземпляр получают через моникеры (англ. monikers). Экземпляр создают вот так,
|
||
когда требуется получить больше одной ссылки на один и тот же экземпляр Word:
|
||
</para>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
|
||
$word = new COM("C:\docs\word.doc");
|
||
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
<para>
|
||
Код создаст новый экземпляр, если нет доступного запущенного экземпляра,
|
||
или вернёт дескриптор запущенного экземпляра, если экземпляр доступен.
|
||
</para>
|
||
</answer>
|
||
</qandaentry>
|
||
<qandaentry xml:id="faq.com.q12">
|
||
<question>
|
||
<para>
|
||
Как обработать событие, которое отправил COM-объект?
|
||
</para>
|
||
</question>
|
||
<answer>
|
||
<para>
|
||
Приёмник события определяют и привязывают функцией <function>com_event_sink</function>.
|
||
Скелет класса приёмника событий функция в PHP генерирует
|
||
функция <function>com_print_typeinfo</function>.
|
||
</para>
|
||
</answer>
|
||
</qandaentry>
|
||
|
||
<qandaentry xml:id="faq.com.q13">
|
||
<question>
|
||
<para>
|
||
При попытке вызвать метод COM-объекта возникли проблемы,
|
||
который даёт больше одного интерфейса. Что делать?
|
||
</para>
|
||
</question>
|
||
<answer>
|
||
<para>
|
||
Ответ настолько же простой, насколько и неудовлетворительный.
|
||
Точно не известно, но, скорее всего, ничего сделать невозможно.
|
||
</para>
|
||
</answer>
|
||
</qandaentry>
|
||
|
||
<qandaentry xml:id="faq.com.q14">
|
||
<question>
|
||
<para>
|
||
Итак, PHP работает с моделью COM, а что насчёт технологии COM+?
|
||
</para>
|
||
</question>
|
||
<answer>
|
||
<para>
|
||
Технология COM+ расширяет модель COM
|
||
за счёт платформы управления компонентами через службу MTS и MSMQ-очередь,
|
||
но PHP не поддерживает ничего отдельно, чтобы работать с такими компонентами.
|
||
</para>
|
||
</answer>
|
||
</qandaentry>
|
||
|
||
<qandaentry xml:id="faq.com.q15">
|
||
<question>
|
||
<para>
|
||
Раз PHP умеет манипулировать COM-объектами, можно ли представить,
|
||
что служба MTS управляет ресурсами компонентов в сочетании PHP?
|
||
</para>
|
||
</question>
|
||
<answer>
|
||
<para>
|
||
Сам PHP пока не обрабатывает транзакции. Поэтому, если возникает
|
||
ошибка, откат не инициируется. При работе с компонентами,
|
||
которые поддерживают транзакции придётся реализовать управление
|
||
транзакциями самому.
|
||
</para>
|
||
</answer>
|
||
</qandaentry>
|
||
|
||
</qandaset>
|
||
</chapter>
|
||
<!-- Keep this comment at the end of the file
|
||
Local variables:
|
||
mode: sgml
|
||
sgml-omittag:t
|
||
sgml-shorttag:t
|
||
sgml-minimize-attributes:nil
|
||
sgml-always-quote-attributes:t
|
||
sgml-indent-step:1
|
||
sgml-indent-data:t
|
||
indent-tabs-mode:nil
|
||
sgml-parent-document:nil
|
||
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
|
||
sgml-exposed-tags:nil
|
||
sgml-local-catalogs:nil
|
||
sgml-local-ecat-files:nil
|
||
End:
|
||
vim600: syn=xml fen fdm=syntax fdl=2 si
|
||
vim: et tw=78 syn=sgml
|
||
vi: ts=1 sw=1
|
||
-->
|