Files
php-doc-ru/reference/exec/functions/proc-open.xml
Alexey Pyltsyn d3bae56d2b Program execution Functions: impovements
git-svn-id: https://svn.php.net/repository/phpdoc/ru/trunk@344292 c90b9560-bf6c-de11-be94-00142212c4b1
2018-02-19 10:48:03 +00:00

316 lines
12 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: e41aab5ecacf449e51179886c17f1d41735b0234 Maintainer: tmn Status: ready -->
<!-- Reviewed: yes Maintainer: lex -->
<!-- $Revision$ -->
<!-- splitted from ./en/functions/exec.xml, last change in rev 1.28 -->
<refentry xml:id='function.proc-open' xmlns="http://docbook.org/ns/docbook">
<refnamediv>
<refname>proc_open</refname>
<refpurpose>
Выполнить команду и открыть указатель на файл для ввода/вывода
</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<type>resource</type><methodname>proc_open</methodname>
<methodparam><type>string</type><parameter>cmd</parameter></methodparam>
<methodparam><type>array</type><parameter>descriptorspec</parameter></methodparam>
<methodparam><type>array</type><parameter role="reference">pipes</parameter></methodparam>
<methodparam choice="opt"><type>string</type><parameter>cwd</parameter></methodparam>
<methodparam choice="opt"><type>array</type><parameter>env</parameter></methodparam>
<methodparam choice="opt"><type>array</type><parameter>other_options</parameter></methodparam>
</methodsynopsis>
<para>
<function>proc_open</function> аналогична <function>popen</function>,
но предоставляет намного больше контроля над выполнением программы.
</para>
<!-- ptys are currently disabled in the sources
<para>
PHP 5 introduces pty support for systems with Unix98 ptys. This allows
your script to interact with applications that expect to be talking to a
terminal. A pty works like a pipe, but is bi-directional, so there is no
need to specify a read/write mode. The example below shows how to use a
pty; note that you don't have to have all descriptors talking to a pty.
Also note that only one pty is created, even though pty is specified 3
times. In a future version of PHP, it might be possible to do more than
just read and write to the pty.
</para>
-->
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>cmd</parameter></term>
<listitem>
<para>
Команда для выполнения
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>descriptorspec</parameter></term>
<listitem>
<para>
Массив, ключи которого представляют собой номер дескриптора, а значение
описывает, как PHP должен передать этот дескриптор дочернему процессу.
0 - stdin, 1 - stdout и 2 - stderr.
</para>
<para>
Каждый элемент может быть:
<simplelist>
<member>
Массивом, описывающим канал (pipe) для передачи процессу. Первый
элемент - это дескриптор типа, второй - настройка для выбранного типа.
Возможные типы: <literal>pipe</literal> (второй элемент либо
<literal>r</literal> для передачи процессу стороны канала для
чтения, либо <literal>w</literal> для передачи стороны записи)
и <literal>file</literal> (второй элемент - имя файла).
</member>
<member>
Ресурсом потока, представляющим дескриптор файла (например, открытый
файл, сокет, <constant>STDIN</constant>).
</member>
</simplelist>
</para>
<para>
Номера дескрипторов не ограничены только 0, 1 и 2 - вы можете назначить
любой действительный номер дескриптора и он будет передан дочернему
процессу. Это позволяет скрипту взаимодействовать с другими скриптами,
работающими, как параллельные процессы. В частности, таким образом можно
передавать данные, требующие защиты, в программы вроде PGP, GPG и
openssl более безопасно. Также это может оказаться полезным для чтения
статусной информации, предоставляемой этими программами на
вспомогательных файловых дескрипторах.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>pipes</parameter></term>
<listitem>
<para>
Будет задан массивом указателей на файлы, соответствующие созданным
каналам передачи данных PHP.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>cwd</parameter></term>
<listitem>
<para>
Рабочая директория команды. Это должен быть
<emphasis role="strong">абсолютный</emphasis> путь к директории или
&null;, если требуется использовать директорию по умолчанию (рабочая
директория текущего процесса PHP).
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>env</parameter></term>
<listitem>
<para>
Массив переменных окружения для запускаемой команды или &null;, если
требуется использовать то же окружение, что и у текущего PHP-процесса.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>other_options</parameter></term>
<listitem>
<para>
Позволяет задать дополнительные настройки. На данный момент
поддерживаются следующие настройки:
<simplelist>
<member>
<literal>suppress_errors</literal> (только для Windows): при установке
в &true; не будут показываться ошибки, возникающие в ходе работы
функции
</member>
<member>
<literal>bypass_shell</literal> (только для Windows): при установке в
&true; процесс будет запущен в обход оболочки
<literal>cmd.exe</literal>
</member>
</simplelist>
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
Возвращает ресурс, представляющий процесс. Этот ресурс необходимо освобождать
функцией <function>proc_close</function> по завершении работы с ним.
В случае ошибки возвращает &false;.
</para>
</refsect1>
<refsect1 role="changelog">
&reftitle.changelog;
<para>
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>&Version;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
<row>
<entry>5.2.1</entry>
<entry>
Настройка <literal>bypass_shell</literal> добавлена в аргумент
<parameter>other_options</parameter>.
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title>Пример использования <function>proc_open</function></title>
<programlisting role="php">
<![CDATA[
<?php
$descriptorspec = array(
0 => array("pipe", "r"), // stdin - канал, из которого дочерний процесс будет читать
1 => array("pipe", "w"), // stdout - канал, в который дочерний процесс будет записывать
2 => array("file", "/tmp/error-output.txt", "a") // stderr - файл для записи
);
$cwd = '/tmp';
$env = array('some_option' => 'aeiou');
$process = proc_open('php', $descriptorspec, $pipes, $cwd, $env);
if (is_resource($process)) {
// $pipes теперь выглядит так:
// 0 => записывающий обработчик, подключенный к дочернему stdin
// 1 => читающий обработчик, подключенный к дочернему stdout
// Вывод сообщений об ошибках будет добавляться в /tmp/error-output.txt
fwrite($pipes[0], '<?php print_r($_ENV); ?>');
fclose($pipes[0]);
echo stream_get_contents($pipes[1]);
fclose($pipes[1]);
// Важно закрывать все каналы перед вызовом
// proc_close во избежание мертвой блокировки
$return_value = proc_close($process);
echo "команда вернула $return_value\n";
}
?>
]]>
</programlisting>
&example.outputs.similar;
<screen>
<![CDATA[
Array
(
[some_option] => aeiou
[PWD] => /tmp
[SHLVL] => 1
[_] => /usr/local/bin/php
)
команда вернула 0
]]>
</screen>
</example>
</para>
<!-- ptys are currently disabled
<para>
<example>
<title>ptys usage</title>
<programlisting role="php">
<![CDATA[
<?php
// Create a pseudo terminal for the child process
$descriptorspec = array(
0 => array("pty"),
1 => array("pty"),
2 => array("pty")
);
$process = proc_open("cvs -d:pserver:cvsread@cvs.php.net:/repository login", $descriptorspec, $pipes);
if (is_resource($process)) {
// work with it here
}
?>
]]>
</programlisting>
</example>
</para>
-->
</refsect1>
<refsect1 role="notes">
&reftitle.notes;
<note>
<para>
Совместимость с Windows: Дескрипторы дальше 2 (stderr) наследуются
дочерними процессам, однако с тех пор как Windows не ассоциирует номера
файловых дескрипторов с низкоуровневыми обработчиками, дочерние процессы
не имеют (пока) к ним доступа. Это не относится к stdin, stdout и stderr.
</para>
</note>
<note>
<para>
Если нужен однонаправленный канал процесса, используйте функцию
<function>popen</function>, так как она значительно проще в использовании.
</para>
</note>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><function>popen</function></member>
<member><function>exec</function></member>
<member><function>system</function></member>
<member><function>passthru</function></member>
<member><function>stream_select</function></member>
<member><link linkend="language.operators.execution">Оператор обратный апостроф</link></member>
</simplelist>
</para>
</refsect1>
</refentry>
<!-- 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
-->