proc_open - Выполняет команду и открывает указатель на файл для ввода/вывода
Вернуться к: Функции запуска программ
proc_open
(PHP 4 >= 4.3.0, PHP 5, PHP 7)
proc_open — Выполняет команду и открывает указатель на файл для ввода/вывода
Описание
$cmd
, array $descriptorspec
, array &$pipes
[, string $cwd
[, array $env
[, array $other_options
]]] )proc_open() аналогична popen() но предоставляет намного больше контроля над исполнением программы.
Список параметров
-
cmd
-
Команда для выполнения
-
descriptorspec
-
Массив, ключи которого представляют собой номер дескриптора, а значение описывает, как PHP должен передать этот дескриптор дочернему процессу. 0 - stdin, 1 - stdout и 2 - stderr.
Каждый элемент может быть:
- Массивом, описывающим канал (pipe) для передачи процессу. Первый элемент это дескриптор типа, второй - настройка для выбранного типа. Возможные типы: pipe (второй элемент либо r для передачи процессу стороны канала для чтения, либо w для передачи стороны записи) и file (второй элемент - имя файла).
-
Ресурсом потока, представляющим дескриптор файла (например, открытый
файл, сокет,
STDIN
).
Номера дескрипторов не ограничены только 0, 1 и 2 - вы можете назначить любой действительный номер дескриптора и он будет передан дочернему процессу. Это позволяет скрипту взаимодействовать с другими скриптами, работающими, как параллельные процессы. В частности, таким образом можно передавать данные, требующие защиты, в программы вроде PGP, GPG и openssl более безопасно. Также это может оказаться полезным для чтения статусной информации, предоставляемой этими программами на вспомогательных файловых дескрипторах.
-
pipes
-
Будет задан массивом указателей на файлы, соответствующие созданным каналам передачи данных PHP.
-
cwd
-
Рабочая директория команды. Это должен быть абсолютный путь к директории или
NULL
, если требуется использовать директорию по умолчанию (рабочая директория текущего PHP процесса). -
env
-
Массив переменных окружения для запускаемой команды или
NULL
, если требуется использовать то же окружение, что и у текущего PHP процесса. -
other_options
-
Позволяет задать дополнительные настройки. На данный момент поддерживаются следующие настройки:
-
suppress_errors (только для Windows): при установке
в
TRUE
не будут показываться ошибки, возникающие в ходе работы функции -
bypass_shell (только для Windows): при установке в
TRUE
процесс будет запущен в обход оболочки cmd.exe
-
suppress_errors (только для Windows): при установке
в
Возвращаемые значения
Возвращает ресурс, представляющий процесс. Этот ресурс необходимо освобождать
функцией proc_close() по завершении работы с ним.
В случае ошибки возвращает FALSE
.
Список изменений
Версия | Описание |
---|---|
5.2.1 |
Настройка bypass_shell добавлена в аргумент
other_options .
|
Примеры
Пример #1 Пример использования proc_open()
<?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";
}
?>
Результатом выполнения данного примера будет что-то подобное:
Array ( [some_option] => aeiou [PWD] => /tmp [SHLVL] => 1 [_] => /usr/local/bin/php ) команда вернула 0
Примечания
Замечание:
Совместимость с Windows: Дескрипторы дальше 2 (stderr) наследуются дочерними процессам, однако с тех пор как Windows не ассоциирует номера файловых дескрипторов с низкоуровневыми обработчиками, дочерние процессы не имеют (пока) к ним доступа. Это не относится к stdin, stdout и stderr.
Замечание:
Если нужен однонаправленный канал процесса, используйте функцию popen(), так как она значительно проще в использовании.
Смотрите также
- popen() - Открывает файловый указатель процесса
- exec() - Исполняет внешнюю программу
- system() - Выполняет внешнюю программу и отображает её вывод
- passthru() - Выполняет внешнюю программу и отображает необработанный вывод
- stream_select() - Запускает эквивалент системного вызова select() на заданных массивах потоков с таймаутом, указанным параметрами tv_sec и tv_usec
- Оператор обратный апостроф
Вернуться к: Функции запуска программ